0

私はPythonで3つの簡単なステップを効率的に実行しようとしています。

(文字列の)リストのリストがあります。それを呼びましょうL

  1. リストのリストを単一のリストLLにフラット化したい。(私はこれを効率的に行う方法を知っています)

  2. 手順1のリストLLから頻度1の単語のセットを作成します。このセットをSと呼びましょう(これを効率的に行う方法も知っています)。

  3. Sに出現するリストLのリストからすべての単語を削除します。

ステップ3を実行する効率的な方法を提案できれば、それは大きな助けになります。

4

4 に答える 4

1

list comprehension3番目のステップには単純なものを使用してください:

>>> from collections import Counter
>>> from itertools import chain
>>> L=[['a','b'],['foo','bar'],['spam','eggs'],['b','c'],['spam','bar']]
>>> S=Counter(chain(*L))
>>> S
Counter({'b': 2, 'bar': 2, 'spam': 2, 'a': 1, 'c': 1, 'eggs': 1, 'foo': 1})

>>> [[y for y in x if S[y]!=1] for x in L]
[['b'], ['bar'], ['spam'], ['b'], ['spam', 'bar']]

あなたがセットを持っている場合R

>>> L=[['a','b'],['foo','bar'],['spam','eggs'],['b','c'],['spam','bar']]
>>> R={'a','foo'}
>>> [[y for y in x if y not in R] for x in L]
[['b'], ['bar'], ['spam', 'eggs'], ['b', 'c'], ['spam', 'bar']]
于 2012-10-17T18:05:02.613 に答える
0
import collections
import operator

LL = reduce(operator.add, L)
counted_L = collections.Counter(LL)
def filter_singles(sublist):
  return [value for value in sublist if counted_L[value] != 1]
no_single_freq_L = [filter_singles(sublist) for sublist in L]
于 2012-10-17T17:50:51.163 に答える
0
>>> #Tools Needed
>>> import collections
>>> import itertools
>>> #Just for this example
>>> import keyword
>>> import random
>>> #Now create your example data
>>> L = [random.sample(keyword.kwlist,5) for _ in xrange(5)]
>>> #Flatten the List (Step 1)
>>> LL = itertools.chain(*L)
>>> #Create Word Freq (Step 2)
>>> freq = collections.Counter(LL)
>>> #Remove all words with unit frequency (Step 3)
>>> LL = itertools.takewhile(lambda e:freq[e] > 1,freq)
>>> #Display Your result
>>> list(LL)
['and']
>>> L
[['in', 'del', 'if', 'while', 'print'], ['exec', 'try', 'for', 'if', 'finally'], ['and', 'for', 'if', 'print', 'lambda'], ['as', 'for', 'or', 'return', 'else'], ['and', 'global', 'or', 'while', 'lambda']]
>>> 
于 2012-10-17T18:58:23.300 に答える
0

ステップ 2 でセットを作成することについてはすでに述べました。組み込み型setを使用すると、ステップ 3 が非常に読みやすく、理解しやすくなります。

# if you are already working with sets:
LL - S

# or convert to sets
set(LL) - set(S)

簡単な例

>>> all_ten = set(range(0,10))
>>> evens = set(range(0,10,2))
>>> odds = all_ten - evens
>>> odds
set([0, 8, 2, 4, 6,])
于 2012-10-17T18:42:29.443 に答える