我想比较一个列表列表,其中每个子列表包含两个字符串(ID和时间戳)和一个成员子列表。我有以下列表清单:
node = [['1001', '2008-01-06T02:12:13Z', ['']],
['1002', '2008-01-06T02:13:55Z', ['']],
['1003', '2008-01-06T02:13:00Z', ['Lion', 'Rhinoceros', 'Leopard', 'Panda']],
['1004', '2008-01-06T02:15:20Z', ['Lion', 'Leopard', 'Eagle', 'Panda', 'Tiger']],
['1005', '2008-01-06T02:15:48Z', ['Lion', 'Panda', 'Cheetah', 'Goat', 'Tiger']],
['1006', '2008-01-06T02:13:30Z', ['']],
['1007', '2008-01-06T02:13:38Z', ['Cheetah', 'Tiger', 'Goat']]]
我想创建一个新的列表列表,记录每个成员的第一次出现及其ID。我想要一个如下列表:
output = [['1001', ''], ['1003', 'Lion'], ['1003', 'Rhinoceros'], ['1003', 'Leopard'],
['1003', 'Panda'], ['1004', 'Eagle'], ['1004', 'Tiger'], ['1005', 'Cheetah']
['1005', 'Goat']]
我尝试了以下代码,但它停止了我的电脑并继续运行。我必须重新启动计算机才能恢复感觉。
output= []
# Add the first id and member
for elements in node[0][2]:
output.append([node[0][0], elements])
for items in node[1:]:
for members in items[2]:
for root in output:
if member not in root:
output.append([items[0], member])
提前感谢任何帮助和感谢。
答案 0 :(得分:2)
只需环绕它,保留已经看过的set
只动物,只有在以前没有看到它们时才添加它们。
基本代码:
result = []
seenanimals = set()
for ident, _, animals in node:
for a in animals:
if a not in seenanimals:
result.append([ident, a])
seenanimals.add(a)
print(result)
运行here。
答案 1 :(得分:1)
修改列表output
,同时迭代它。不要这样做。
可能不是最优雅的方式,但它可以工作,只要列表中至少有一个元素用于每个ID:
node = [['1001', '2008-01-06T02:12:13Z', ['']],
['1002', '2008-01-06T02:13:55Z', ['']],
['1003', '2008-01-06T02:13:00Z', ['Lion', 'Rhinoceros', 'Leopard', 'Panda']],
['1004', '2008-01-06T02:15:20Z', ['Lion', 'Leopard', 'Eagle', 'Panda', 'Tiger']],
['1005', '2008-01-06T02:15:48Z', ['Lion', 'Panda', 'Cheetah', 'Goat', 'Tiger']],
['1006', '2008-01-06T02:13:30Z', ['']],
['1007', '2008-01-06T02:13:38Z', ['Cheetah', 'Tiger', 'Goat']]]
output = []
unique = []
for l in node:
for item in l[2]:
if item not in unique:
output.append([l[0], item])
unique.append(item)
print(output)
答案 2 :(得分:1)
我会先用这种方式遍历主列表:
item_id_dict = {}
for sublist in node:
for item in sublist[2]:
if item not in item_id_dict:
item_id_dict[item] = []
item_id_dict[item].append(sublist[0])
如果您想避开if item not in item_id_dict
流量控制语句,只需使用defaultdict
。
然后,您可以通过这种方式获得每件商品的最低id
:
first_occurence = {
item: min(item_id_dict[item])
for item in item_id_dict
}
这将是一个字典,每个感兴趣的单词作为其关键字,并且该单词的第一次出现的ID是其值。如果你真的需要它在列表列表中(我不推荐,因为它不是这个问题的直观数据结构),你可以简单地做:
output = []
for item in first_occurence.items():
output.append(list(item))