在列表列表中记录子列表的每个项目的第一次出现

时间:2018-01-07 23:03:36

标签: python python-3.x list

我想比较一个列表列表,其中每个子列表包含两个字符串(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])

提前感谢任何帮助和感谢。

3 个答案:

答案 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))