比较python中的两个列表并打印输出

时间:2013-05-22 10:12:03

标签: python performance

您好我有一个列表列表,我需要将每个列表的值与从XML文件中提取的另一个列表进行比较。结构类似于:

[('example', '123', 'foo', 'bar'), ('example2', '456', 'foo', 'bar'), ...]

我需要将每个列表的第二个值与XML中的值进行比较:

for item in main_list:
    for child in xml_data:
        if item[4] == child.get('value'):
            print item[4]

问题是main_list有大量的行(1000+),并且乘以xml(100+)的值导致大量迭代导致此方法无效。

有没有办法有效地做到这一点?

问候。

1 个答案:

答案 0 :(得分:6)

对集合的成员资格检查将明显快于手动迭代和检查:

children = {child.get('value') for child in xml_data}
for item in main_list:
    if item[4] in children:
        print(item[4])

在这里,我们使用简单的set comprehension构建集合。

请注意,交换集合中的数据可能是值得的 - 如果main_list更长,那么制作该数据集会更有效。

items = {item[4] for item in main_list}
for child in xml_data:
    value = child.get('value')
    if value in items:
        print(value)

这两者也只对数据进行一次处理,而不是每次进行检查。

请注意,一组处理设置端的重复值或顺序 - 如果这很重要,则这不是有效的解决方案。此版本仅使用您正在迭代的数据中的顺序/重复项。如果这无效,那么您仍然可以事先处理数据,并使用itertools.product()更快地迭代。

items = [item[4] for item in main_list]
children = [child.get('value') for child in xml_data]

for item, child in itertools.product(items, children):
    if item == child:
        print(item)

正如Karl Knechtel所指出的那样,如果你真的不关心重复的命令,你可以做一套交集:

for item in ({child.get('value') for child in xml_data} &
             {item[4] for item in main_list}):
    print(item)