1

嗨,我有一个列表列表,我需要将每个列表的值与从 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+)导致大量迭代变得这种方法效率低下。

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

问候。

4

1 回答 1

6

对集合的成员资格检查将比手动迭代和检查快得多:

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

这里我们用一个简单的集合推导来构造集合。

请注意,交换集合中的数据可能是值得的 - 如果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)
于 2013-05-22T10:16:11.360 回答