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

4

我有一个包含元组的列表和一个包含列表的字典,具体如下。

# 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, )
1个回答

5
首先,在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]

示例:

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

这看起来非常高效,但使用列表推导式不会保留排序顺序,因为它返回一个新的列表对象。我应该在问题中提到保留顺序。不过这很好。 - Amyth
@Amyth:列表推导式保留了“lot”的顺序。您所指的顺序是什么? - Martijn Pieters
我的错,当然可以,它使用相同的顺序进行迭代。 - Amyth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接