2017-04-19 43 views
1

的列表不同的順序排序出對從列表具有相同的成員,但來自對

l =[(3,4),(2,3),(4,3),(3,2)] 

我要理清與以相反的順序相同的成員對所有第二齣場。也就是說,結果應該是

[(3,4),(2,3)] 

Python中最簡潔的方法是什麼?

+0

這只是一個巧合,結果元組都是按順序排列的?或者我們也可以期待不同的順序?另外,我們是否總能期望每個元組都有一個顛倒的「姐妹」?會有自己的元組嗎? – blacksite

+0

絕對,訂單上沒有收縮。我只是想以不同的順序排除每個第二個元組。 – user1934212

回答

0

這應該做的伎倆:

[x for i, x in enumerate(l) if any(y[::-1] == x for y in l[i:])] 
Out[23]: [(3, 4), (2, 3)] 

擴大初步名單一點點不同的排序:

l =[(3,4),(2,3),(4,3),(3,2), (1,3), (3,1)] 

[x for i, x in enumerate(l) if any(y[::-1] == x for y in l[i:])] 
Out[25]: [(3, 4), (2, 3), (1, 3)] 

,並根據每個元組是否保證有一個伴隨「姐妹「顛倒元組,邏輯可能會改變以保持」單身「元組:

l = [(3, 4), (2, 3), (4, 3), (3, 2), (1, 3), (3, 1), (10, 11), (10, 12)] 

[x for i, x in enumerate(l) if any(y[::-1] == x for y in l[i:]) or not any(y[::-1] == x for y in l)] 
Out[35]: [(3, 4), (2, 3), (1, 3), (10, 11), (10, 12)] 
+0

最新一行的作品,但不易讀,也不「最簡潔」 – Guillaume

+0

@Guillaume我從來沒有說過它是最簡潔的:) – blacksite

1

另外,人們可能會做一個更詳細的方式:

l = [(3,4),(2,3),(4,3),(3,2)] 
L = [] 
omega = set([]) 
for a,b in l: 
    key = (min(a,b), max(a,b)) 
    if key in omega: 
     continue 
    omega.add(key) 
    L.append((a,b)) 

print(L) 
1

如果我們只想保留每對的第一個元組:

l =[(3,4),(2,3),(4,3),(3,2), (3, 3), (5, 6)] 

def first_tuples(l): 
    # We could use a list to keep track of the already seen 
    # tuples, but checking if they are in a set is faster 
    already_seen = set() 
    out = [] 
    for tup in l: 
     if set(tup) not in already_seen: 
      out.append(tup) 
      # As sets can only contain hashables, we use a 
      # frozenset here 
      already_seen.add(frozenset(tup)) 
    return out 

print(first_tuples(l)) 
# [(3, 4), (2, 3), (3, 3), (5, 6)] 
+0

只是一個挑剔 - 該OP提到,目標是「擺脫每個第二個元組同樣的配對以不同的順序「 - 我想知道'fs in set' - 它不能保證提供第一個,是嗎? (因爲一套沒有訂購...) – ewcz

+0

你說得對,我更新了答案。 –

0

恕我直言,這應該是兩個比較短,更清晰任何迄今貼:

my_tuple_list = [(3,4),(2,3),(4,3),(3,2)] 

set((left, right) if left < right else (right, left) for left, right in my_tuple_list) 

>>> {(2, 3), (3, 4)} 

它僅製作一組的所有元組,其成員被交換預先如果第一構件是>第二部件構成。

+0

這個符號確實相當優雅,但恕我直言,它的做法稍有不同。 OP提到目標是「以不同的順序排除每個第二個元組的相同配對」,即對於[(4,3),(2,1),(3,4)]產生' [(4,3),(2,1)]'。這段代碼用「i <= j」將所有元組「歸一化」爲「(i,j)」,並且也不尊重元組的原始順序... – ewcz

相關問題