Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中复杂的列表和字典查找_Python_List_Dictionary_Tuples_Lookup - Fatal编程技术网

python中复杂的列表和字典查找

python中复杂的列表和字典查找,python,list,dictionary,tuples,lookup,Python,List,Dictionary,Tuples,Lookup,我有一个元组列表和一个列表字典,如下所示 # List of tuples lot = [('Item 1', 43), ('Item 4', 82), ('Item 12', 33), ('Item 10', 21)] # dict of lists dol = { 'item_category_one': ['Item 3', 'Item 4'], 'item_category_two': ['Item 1'], 'item_category_thr': ['It

我有一个元组列表和一个列表字典,如下所示

# List of tuples
lot = [('Item 1', 43), ('Item 4', 82), ('Item 12', 33), ('Item 10', 21)]

# dict of lists
dol = {

    'item_category_one': ['Item 3', 'Item 4'],
    'item_category_two': ['Item 1'],
    'item_category_thr': ['Item 2', 'Item 21'],
}
现在我想查找
dol
中任何列表中的任何项是否存在于
lot
中给定的任何元组中。如果满足这个要求,那么我想向相应的元组添加另一个变量

目前我正在做如下的事情(看起来效率非常低,而且很难看)。我想知道实现这一目标的最有效的方法。有什么可能性

PS:我也希望在这样做的同时保持
lot
的顺序

merged = [x[0] for x in lot]

for x in dol:
    for item in dol[x]:
        if item in merged:
            for x in lot:
                if x[0] == item:
                    lot[lot.index(x)] += (True, )

首先,在
dol
结构中构建一组您的所有值:

from itertools import chain
dol_values = set(chain.from_iterable(dol.itervalues()))
现在,成员资格测试非常有效,您可以使用列表理解:

[tup + (True,) if tup[0] in dol_values else tup for tup in lot]
演示:


这看起来非常有效,但是使用列表理解并不能保持排序顺序,因为它返回一个新的列表对象。我应该在问题中提到维护秩序。这很好。@Amyth:list comprehension保留了
lot
的顺序。你指的是什么顺序?我的错,当然是,它使用相同的顺序进行迭代。
>>> from itertools import chain
>>> dol_values = set(chain.from_iterable(dol.itervalues()))
>>> dol_values
set(['Item 3', 'Item 2', 'Item 1', 'Item 21', 'Item 4'])
>>> [tup + (True,) if tup[0] in dol_values else tup for tup in lot]
[('Item 1', 43, True), ('Item 4', 82, True), ('Item 12', 33), ('Item 10', 21)]