我正在尝试比较多个列表。但是这些列表通常不是标签。我正在使用while循环每次创建一个新列表并相应地标记它们。因此,例如,如果while循环运行3次,则会生成List1
个List2
和List3
。接下来是创建列表的代码片段。
for link in links:
print('*', link.text)
locals()['list{}'.format(str(i))].append(link.text)
所以我想比较每个列表中的字符串,但我想一次比较所有列表然后打印出常见的字符串。
我觉得我会使用这样的东西,但我不是百分百肯定。
lists = [list1, list2, list3, list4, list5, list6, list7, list8, list9, list10]
common = list(set().union(*lists).intersection(Keyword))
答案 0 :(得分:2)
不要直接修改locals()
(通常不是一个好主意),而是使用defaultdict
作为容器。此数据结构允许您动态创建新的键值对,而不是依赖于某个方面肯定会导致NameError
的方法。
from collections import defaultdict
i = ...
link_lists = defaultdict(list)
for link in links:
print('*', link.text)
link_lists[i].append(link.text)
所有列表的find the intersection:
all_lists = list(link_lists.values())
common_links = set(all_lists[0]).intersection(*all_lists[1:])
在Python 2.6+中,您可以将多个迭代项传递给set.intersection
。这就是星辰在这里做的事情。
以下是交叉点如何工作的示例:
>>> from collections import defaultdict
>>> c = defaultdict(list)
>>> c[9].append("a")
>>> c[0].append("b")
>>> all = list(c.values())
>>> set(all[0]).intersection(*all[1:])
set()
>>> c[0].append("a")
>>> all = list(c.values())
>>> set(all[0]).intersection(*all[1:])
{'a'}
答案 1 :(得分:1)
您有多种选择,
选项a)
使用itertools获取笛卡尔积,这非常好,因为它是一个迭代器
a = ["A", "B", "C"]
b = ["A","C"]
c = ["C","D","E"]
for aval,bval,cval in itertools.product(a,b,c):
if aval == bval and bval == cval:
print aval
选项b)
使用集(推荐):
all_lists = []
# insert your while loop X times
for lst in lists: # This is my guess of your loop running.
currentList = map(lambda x: x.link, links)
all_lists.append(currentList) # O(1) operation
result_set = set()
if len(all_lists)>1:
result_set = set(all_lists[0]).intersection(*all_lists[1:])
else:
result_set = set(all_lists[0])
然而,使用这些集会更快