2016-12-03 16 views
-1

私は、次のネストされたリストを持っている:1つのネストされたリストから交差を取得しますか?

list_ = [['The'], ['The', 'fox', 'quick'], ['quick', 'the'], ['dog']] 

私が試したどのように効率的に各サブリストとの交点を計算することができます?:

['the', 'quick'] 

list(itertools.product([for e in [list_]])) 
+0

すべてのペアごとの交差のリストが必要ですか? – DyZ

+0

@DYZありがとう、はい! –

+2

出力が意味をなさない。 '['' '、[' quick ']、[]]'のようなものがもっと意味をなさないでしょう。 – wim

答えて

4

まず、あなたを前処理しますすべての単語を小文字にするリスト:

list_ = [set(word.lower() for word in item) for item in list_] 

は、その後、あなたはitertools.combinationsを使用したいとset()操作:

l = [set(map(str.lower, sub)) for sub in list_] 

をリスト内のすべての単語のユニークなセットを作成します:あなたの最初のリスト内の単語が

results = [x&y for x,y in itertools.combinations(list_,2)] 
# [{'the'}, {'the'}, set(), {'the', 'quick'}, set(), set()] 
+0

出力は次のとおりです: '{{''}、set()、set()、{'quick'}、set()、set()]'。実際には正しいですが、私は単一のフラットリストを残したいと思います: '['' '' quick ']'。私は空のセットを次のように削除しようとしました: 'list2 = [x for list1 in x!= {}]' –

+0

それでも、うまくいきませんでした。 –

+0

実際、 '{} '、set()、set()、{' quick '}、set()、set()は正解です。 –

2

小文字

s = set(i for sub in l for i in sub) 

これらを除外:

r = [i for i in s if all(i in sub for sub in l)] 

rにすべてのサブリストに属するメンバーが含まれるようになりました。

+0

ありがとうございました! –

3

まず、小文字のすべてとのセットを作成します。

list_ = [['The', 'fox'], ['The', 'fox', 'quick'], ['lazy','quick', 'the', 'fox'], ['fox', 'the', 'dog']] 
list2 = [{item.lower() for item in l} for l in list_] 

そして、最初のセットで始まる、一連の操作を使用します。

i = iter(list2) 
result = next(i) 
for s in i: 
    result &= s 

結果は{'the', 'fox'}です。セットの代わりにリストが必要な場合は、それをlist()関数に送ることができます。ここでセットを使用すると、任意の順序が生成されることに注意してください。

>>> result 
{'the', 'fox'} 
>>> list(result) 
['the', 'fox'] 
+0

ありがとうございました! –

2
>>> list_ = [['The', 'fox'], ['The', 'fox', 'quick'], ['lazy','quick', 'the', 'fox'], ['fox', 'the', 'dog']] 

まず、すべての文字列に低く適用されます。

>>> list_ = map(lambda l: map(lambda w: w.lower(), l), list_) 

第二には、リストの残りの部分と最初のリストを交差:

>>> list(set(list_[0]).intersection(*list_[1:])) 
['the', 'fox'] 
+0

ありがとうございました! –

+0

私はこの例外があります: 'TypeError: 'map'オブジェクトはサブスクリプトできません.' – tumbleweed

+1

Opps、私はpython-3.xタグを見ませんでした。これはPython 2の答えです。それぞれの 'map'の周りに' list() 'を投げます。 –

2
>>> capital_list = list() 
>>> for inner in list_: 
...  capital_list.append([x.upper() for x in inner]) 
... 
>>> capital_list 
[['THE', 'FOX'], ['THE', 'FOX', 'QUICK'], ['LAZY', 'QUICK', 'THE', 'FOX'], ['FOX', 'THE', 'DOG']>>> shared = set() 
>>> for inner in capital_list: 
...  shared = set(inner) if not shared else shared.intersection(inner) 
... 
>>> shared 
{'THE', 'FOX'}] 

すべての要素を変換します内部リストから大文字へcapital_listの出力を参照 すべての共有内部リスト内のすべての共有要素を見つける:すべての内部リストを集合に変換し、交差要素を使用して共有要素を取得する

+0

ありがとうございました! –

関連する問題