0

複数のリストを比較しようとしています。ただし、リストはラベルではありません...通常。while ループを使用して毎回新しいリストを作成し、それに応じてラベルを付けています。たとえば、while ループが 3 回実行されると、List1aList2とが作成されList3ます。次に、リストを作成するコードのスニペットを示します。

for link in links:
    print('*', link.text)
    locals()['list{}'.format(str(i))].append(link.text)

そのため、各リストに含まれる文字列を比較したいのですが、すべてのリストを一度に比較してから、共通の文字列を出力したいと考えています。

このようなものを使用する気がしますが、100%確実ではありません。

lists = [list1, list2, list3, list4, list5, list6, list7, list8, list9, list10]
common = list(set().union(*lists).intersection(Keyword))
4

2 に答える 2

3

直接変更するのではなくlocals()(一般的には良い考えではありません)、 をdefaultdictコンテナーとして使用します。NameErrorこのデータ構造により、ある時点で必ず a につながるメソッドに依存するのではなく、その場で新しいキーと値のペアを作成できます。

from collections import defaultdict

i = ...

link_lists = defaultdict(list)
for link in links:
    print('*', link.text)
    link_lists[i].append(link.text)

すべてのリストの交点を見つけるには:

all_lists = list(link_lists.values())
common_links = set(all_lists[0]).intersection(*all_lists[1:])

Python 2.6+ では、複数の iterable を に渡すことができますset.intersection。これは、ここで star-args が行うことです。


交差がどのように機能するかの例を次に示します。

>>> 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'}
于 2013-04-05T02:52:47.020 に答える