如何找到哪些项目不在输出列表中的列表并将列表添加到输出列表?

How to find list which items are not in output list and add list to output list?

我有一个 ID 为 total_list 的列表。如果在 accepted_list 中找到 none 的 ID,我想将 total_list 中的列表添加到 accepted_list。这是一个数据集和我使用的代码。任何帮助表示赞赏。谢谢。

Sample of total_list = [[u'19'], [u'34', u'36'], [u'34', u'36'], [u'50', u'51'], [u'46', u'47'], [u'48', u'49'], [u'38', u'39', u'40'], [u'41', u'42', u'44'], [u'46', u'47', u'48'], [u'47', u'48', u'49'], [u'37', u'50', u'51'], [u'294', u'295', u'296'], [u'296', u'297', u'298'], [u'37', u'38', u'51'], [u'41', u'42', u'43', u'44'], [u'37', u'38', u'39', u'40'], [u'294', u'295', u'296', u'297'], [u'40', u'41', u'43', u'44'], [u'295', u'296', u'297', u'298'], [u'784', u'785', u'786', u'793'], [u'26', u'787', u'788', u'789', u'808'], [u'38', u'39', u'40', u'41', u'43'], [u'40', u'41', u'42', u'43', u'44'], [u'778', u'779', u'780', u'781', u'782'], [u'294', u'295', u'296', u'297', u'298'], [u'783', u'784', u'785', u'786', u'791', u'792'], [u'794', u'795', u'796', u'798', u'799', u'800'], [u'778', u'779', u'780', u'781', u'782', u'783'], [u'778', u'779', u'780', u'781', u'782', u'787', u'788'], [u'783', u'784', u'785', u'786', u'791', u'792', u'793'], [u'26', u'780', u'781', u'782', u'787', u'788', u'789'], [u'792', u'793', u'794', u'795', u'796', u'798', u'799'], [u'793', u'794', u'795', u'796', u'798', u'799', u'800'], [u'21', u'22', u'23', u'24', u'25', u'816', u'817'], [u'21', u'22', u'23', u'24', u'25', u'815', u'816', u'817'], [u'26', u'780', u'781', u'782', u'787', u'788', u'789', u'790'], [u'21', u'22', u'23', u'24', u'25', u'815', u'816', u'817'], [u'778', u'779', u'780', u'781', u'782', u'783', u'787', u'788', u'789'], [u'21', u'22', u'23', u'24', u'25', u'814', u'815', u'816', u'817'], [u'778', u'779', u'780', u'781', u'782', u'783', u'787', u'788', u'789'], [u'779', u'780', u'781', u'783', u'784', u'785', u'789', u'790', u'791'], [u'783', u'788', u'789', u'790', u'791', u'792', u'797', u'804', u'805'], [u'26', u'780', u'781', u'783', u'787', u'788', u'789', u'790', u'804'], [u'21', u'22', u'23', u'24', u'25', u'814', u'815', u'816', u'817'], [u'26', u'808', u'809', u'810', u'814', u'815', u'816', u'817', u'818'], [u'808', u'809', u'810', u'813', u'814', u'815', u'816', u'817', u'818'], [u'795', u'796', u'797', u'798', u'799', u'800', u'801', u'802', u'803', u'811'], [u'785', u'786', u'791', u'792', u'793', u'794', u'795', u'797', u'798', u'799'], [u'801', u'806', u'809', u'810', u'811', u'812', u'813', u'814', u'815', u'817', u'818'], [u'801', u'802', u'803', u'806', u'809', u'810', u'811', u'812', u'813', u'814', u'815'], [u'784', u'785', u'790', u'791', u'792', u'793', u'794', u'797', u'798', u'799', u'803', u'804'], [u'21', u'22', u'23', u'24', u'25', u'808', u'809', u'814', u'815', u'816', u'817', u'818'], [u'792', u'793', u'794', u'795', u'796', u'797', u'798', u'799', u'800', u'801', u'802', u'803'], [u'797', u'798', u'799', u'800', u'801', u'802', u'803', u'806', u'810', u'811', u'812', u'813'], [u'789', u'790', u'791', u'792', u'797', u'802', u'803', u'804', u'805', u'806', u'810', u'811'], [u'783', u'784', u'785', u'790', u'791', u'792', u'793', u'797', u'798', u'803', u'804', u'805'], [u'790', u'791', u'797', u'798', u'802', u'803', u'804', u'805', u'806', u'809', u'810', u'811'], [u'797', u'798', u'801', u'802', u'803', u'804', u'805', u'806', u'809', u'810', u'811', u'812', u'813'], [u'24', u'25', u'808', u'809', u'810', u'811', u'812', u'813', u'814', u'815', u'816', u'817', u'818'], [u'797', u'798', u'799', u'800', u'801', u'802', u'803', u'804', u'805', u'806', u'810', u'811', u'812'], [u'805', u'806', u'808', u'809', u'810', u'811', u'812', u'813', u'814', u'815', u'816', u'817', u'818'], [u'797', u'800', u'801', u'802', u'803', u'804', u'805', u'806', u'809', u'810', u'811', u'812', u'813', u'814'], [u'22', u'23', u'24', u'25', u'808', u'809', u'810', u'812', u'813', u'814', u'815', u'816', u'817', u'818'], [u'21', u'22', u'23', u'24', u'25', u'808', u'809', u'810', u'813', u'814', u'815', u'816', u'817', u'818'], [u'791', u'792', u'797', u'798', u'799', u'800', u'801', u'802', u'803', u'804', u'805', u'806', u'811', u'812'], [u'791', u'792', u'793', u'794', u'795', u'796', u'797', u'798', u'799', u'800', u'801', u'802', u'803', u'805', u'806'], [u'790', u'791', u'792', u'793', u'797', u'798', u'799', u'800', u'801', u'802', u'803', u'804', u'805', u'806', u'811'], [u'801', u'802', u'804', u'805', u'806', u'808', u'809', u'810', u'811', u'812', u'813', u'814', u'815', u'817', u'818']]

因此,当我检查 total_list 时,第一项是 19,在我的 [=30= 的列表 中找不到](空)。一旦它在 total_list 的列表中找到一个项目,它在我的 accepted_list 的列表中,它就不会将它添加到 accepted_list.

accept_intersect = []
inaccept = False

for i in totallist:
    if not accept_intersect:
        accept_intersect.append(i)
        continue
    for p in i:
        for a in accept_intersect:
            if p in a:
                inaccept = True
                break
    if inaccept is False:
        accept_intersect.append(i)
    elif inaccept is True:
        pass

for a in accept_intersect:'
    print a

有没有看到id用字典存储可能会更快

accept_intersect=[]
seen = {}

for item in totallist:
    for sub_item in item:
        if sub_item not in seen:
            accept_intersect.append(sub_item)
            seen[sub_item] = True;

print accept_intersect

如果此回答对您有所帮助,请按左侧的绿色对勾。

编辑,根据要求更新

accept_intersect=[]
seen = {}

for item in totallist: 

    # Track if a subitem has been seen
    seen_flag = False

    for sub_item in item:

        # If it has been seen before
        # stop looking in this list
        if sub_item in seen:
            seen_flag = True
            break

        # Add seen item
        seen[sub_item] = True

    # If a subitem was seen, skip and continue
    # with the next loop.
    if seen_flag == True:
        continue

    # Only append if no items were seen before.
    accept_intersect.append(item)

#totallist = [['19'], ['19', '22']]
#accept_intersect -> [['19']]

#totallist = [['19'], ['19', '22'], ['43'], ['44', '45'], ['65', '19']]
#accept_intersect -> [['19'], ['43'], ['44', '45']]

您希望按从高到低排序的位置与此解决方案无关。当您构建 total_list 输入时,只需按您想要的方式排列即可。

我不会使用 dict,因为 set 是两个用例中任何一个的本机实现:

1) 输出扁平化

2) 接受二级输出

以下答案提供了两种可能性(因为我不清楚问题中要求的是哪一种):

#! /usr/bin/env python
from __future__ import print_function

total_list = [['19'], ['34', '36'], ['34', '36'], ['50', '51']]

accept_intersect = []
seen = set()

for item_seq in total_list:
    for item in item_seq:
        hashable_item = tuple(item)
        if hashable_item not in seen:
            accept_intersect.append(item)
            seen.add(hashable_item)

print(accept_intersect)

accept_intersect = []
seen = set()

for item_seq in total_list:
    hashable_item = tuple(item_seq)
    if hashable_item not in seen:
        accept_intersect.append(item_seq)
        seen.add(hashable_item)

print(accept_intersect)

当 运行:

时在我的机器上产生
['19', '34', '36', '50', '51']
[['19'], ['34', '36'], ['50', '51']]

所以需要规范的要点是,如果你想要变体 1) 扁平化,那么你输入的内容会自动散列,因此适合字典并设置为键,所以其他建议的答案(迄今为止)也有效。但是如果你想接受列表作为条目并且想过滤掉列表的重复项并保持那些唯一的完整(即变体 2)而不展平,那么上面的技巧在检查 unqiueness 之前将列表映射到元组是可行的方法。

我将 tuple() 调用留在了展平变体(第一个循环)中,因为这可能更健壮并且使算法更加清晰(IMO)。

在几乎一行中相同(使用不同的检查算法和列表理解中的小技巧):

ch_l=[]
out_l=[]
out_l=[x for x in total_list if any(y not in ch_l for y in x) and [ch_l.append(z) for z in x if x]]

输出:

out_l= [[u'19'], [u'34', u'36'], [u'50', u'51'], [u'46', u'47'], [u'48', u'49'], [u'38', u'39', u'40'], [u'41', u'42', u'44'], [u'37', u'50', u'51'], [u'294', u'295', u'296'], [u'296', u'297', u'298'], [u'41', u'42', u'43', u'44'], [u'784', u'785', u'786', u'793'], [u'26', u'787', u'788', u'789', u'808'], [u'778', u'779', u'780', u'781', u'782'], [u'783', u'784', u'785', u'786', u'791', u'792'], [u'794', u'795', u'796', u'798', u'799', u'800'], [u'21', u'22', u'23', u'24', u'25', u'816', u'817'], [u'21', u'22', u'23', u'24', u'25', u'815', u'816', u'817'], [u'26', u'780', u'781', u'782', u'787', u'788', u'789', u'790'], [u'21', u'22', u'23', u'24', u'25', u'814', u'815', u'816', u'817'], [u'783', u'788', u'789', u'790', u'791', u'792', u'797', u'804', u'805'], [u'26', u'808', u'809', u'810', u'814', u'815', u'816', u'817', u'818'], [u'808', u'809', u'810', u'813', u'814', u'815', u'816', u'817', u'818'], [u'795', u'796', u'797', u'798', u'799', u'800', u'801', u'802', u'803', u'811'], [u'801', u'806', u'809', u'810', u'811', u'812', u'813', u'814', u'815', u'817', u'818']]

我还不能完全确定是不是OP要求的算法,但是测试输出没问题,代码看起来还不错。

它也应该更快(我希望)。