的列表不同的順序排序出對從列表具有相同的成員,但來自對
l =[(3,4),(2,3),(4,3),(3,2)]
我要理清與以相反的順序相同的成員對所有第二齣場。也就是說,結果應該是
[(3,4),(2,3)]
Python中最簡潔的方法是什麼?
的列表不同的順序排序出對從列表具有相同的成員,但來自對
l =[(3,4),(2,3),(4,3),(3,2)]
我要理清與以相反的順序相同的成員對所有第二齣場。也就是說,結果應該是
[(3,4),(2,3)]
Python中最簡潔的方法是什麼?
這應該做的伎倆:
[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)]
另外,人們可能會做一個更詳細的方式:
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)
如果我們只想保留每對的第一個元組:
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)]
只是一個挑剔 - 該OP提到,目標是「擺脫每個第二個元組同樣的配對以不同的順序「 - 我想知道'fs in set' - 它不能保證提供第一個,是嗎? (因爲一套沒有訂購...) – ewcz
你說得對,我更新了答案。 –
恕我直言,這應該是兩個比較短,更清晰任何迄今貼:
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)}
它僅製作一組的所有元組,其成員被交換預先如果第一構件是>第二部件構成。
這個符號確實相當優雅,但恕我直言,它的做法稍有不同。 OP提到目標是「以不同的順序排除每個第二個元組的相同配對」,即對於[(4,3),(2,1),(3,4)]產生' [(4,3),(2,1)]'。這段代碼用「i <= j」將所有元組「歸一化」爲「(i,j)」,並且也不尊重元組的原始順序... – ewcz
這只是一個巧合,結果元組都是按順序排列的?或者我們也可以期待不同的順序?另外,我們是否總能期望每個元組都有一個顛倒的「姐妹」?會有自己的元組嗎? – blacksite
絕對,訂單上沒有收縮。我只是想以不同的順序排除每個第二個元組。 – user1934212