繁体   English   中英

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

[英]Record first occurence of each item of a sublist in a list of lists

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

提前感谢您的帮助和感谢。

只需在其上循环,维护一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)

在这里运行。

您可以在迭代列表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)

我将首先以这种方式遍历主列表:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM