比较多个列表Python

时间:2013-04-05 02:41:10

标签: python list compare python-3.3

我正在尝试比较多个列表。但是这些列表通常不是标签。我正在使用while循环每次创建一个新列表并相应地标记它们。因此,例如,如果while循环运行3次,则会生成List1List2List3。接下来是创建列表的代码片段。

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

2 个答案:

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

然而,使用这些集会更快