我有 2 個串列:
list_1 = [[1,1], [1,3], [1,1], [1,4]]
list_2 = ["string_1", "string_2", "string_3", "string_4"]
我的目標是洗掉重復的子串列list_1以及其中的字串與洗掉的子串列list_2具有相同的索引,同時保持子串列的順序。
我發現我可以洗掉重復的子串列,同時保持這個 SO中子串列的順序:
from itertools import *
def unique_everseen(iterable, key=None):
"List unique elements, preserving order. Remember all elements ever seen."
seen = set()
seen_add = seen.add
if key is None:
for element in filterfalse(seen.__contains__, iterable):
seen_add(element)
yield element
else:
for element in iterable:
k = key(element)
if k not in seen:
seen_add(k)
yield element
list(unique_everseen(list_1, key=frozenset))
但目前尚不清楚如何匹配洗掉的子串列索引list_2
最佳輸出:
new_list_1 = [[1,1], [1,3], [1,4]]
new_list_2 = ["string_1", "string_2", "string_4"]
uj5u.com熱心網友回復:
您可以使用zip:
list_1 = [[1,1], [1,3], [1,1], [1,4]]
list_2 = ["string_1", "string_2", "string_3", "string_4"]
output_1, output_2 = [], []
seen = set()
for sublst, s in zip(list_1, list_2):
if (tup := tuple(sublst)) in seen:
continue
seen.add(tup)
output_1.append(sublst)
output_2.append(s)
print(output_1) # [[1, 1], [1, 3], [1, 4]]
print(output_2) # ['string_1', 'string_2', 'string_4']
請注意,您需要將tuple(sublst)(而不是sublst自身)存盤在 setseen中,因為sublstlike[1,1]是不可散列的。
uj5u.com熱心網友回復:
res1 = []
res2 = []
for i in range(len(list_1)):
if list_1[i] not in list_1[:i]:
res1.append(list_1[i])
res2.append(list_2[i])
或者
res1, res2 = map(list, zip(*[(list_1[i], list_2[i]) for i in range(len(list_1)) if list_1[i] not in list_1[:i]]))
uj5u.com熱心網友回復:
您只需要保留一個額外的串列來跟蹤 list_1 中的重復項,然后使用理解串列來縮短結果串列。
list_1 = [[1,1], [1,3], [1,1], [1,4]]
list_2 = ["string_1", "string_2", "string_3", "string_4"]
selector = [True] * len(list_1)
for i in range(len(list_1)):
for j in range(i):
if list_1[j] == list_1[i]:
selector[i] = False
break
new_list_1 = [element for i, element in enumerate(list_1) if selector[i]]
new_list_2 = [element for i, element in enumerate(list_2) if selector[i]]
uj5u.com熱心網友回復:
解決方案set()和zip
def deduplicate(items):
seen = set()
for a, b in items:
a = tuple(a)
if not a in seen:
seen.add(a)
yield list(a), b
list_1 = [[1,1], [1,3], [1,1], [1,4]]
list_2 = ["string_1", "string_2", "string_3", "string_4"]
tmp = list(deduplicate(zip(list_1, list_2)))
print([x[0] for x in tmp])
print([x[1] for x in tmp])
# [[1, 1], [1, 3], [1, 4]]
# ['string_1', 'string_2', 'string_4']
uj5u.com熱心網友回復:
另一種基于您的代碼的實作,只需修改您的函式以回傳唯一元素的索引而不是元素本身:
from itertools import *
list_1 = [[1,1], [1,3], [1,1], [1,4]]
list_2 = ["string_1", "string_2", "string_3", "string_4"]
def unique_everseen(iterable):
# Lists indexes of unique elements in iterable, preserving order.
seen = set()
seen_add = seen.add
for element in iterable:
k = frozenset(element)
if k not in seen:
seen_add(k)
yield iterable.index(element)
unique_indexes = [i for i in unique_everseen(list_1)]
print(unique_indexes)
filtered_list_1 = [list_1[i] for i in unique_indexes]
filtered_list_2 = [list_2[i] for i in unique_indexes]
print(filtered_list_1)
print(filtered_list_2)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/518395.html
標籤:Python列表
下一篇:為什么一個元素不列印?
