您好我有一个列表列表,我需要将每个列表的值与从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+)的值导致大量迭代导致此方法无效。
有没有办法有效地做到这一点?
问候。
答案 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)