1

重複の可能性:
コードをセットにするにはどうすればよいですか?
pythonはリストを取得し、setを使用して負の値も存在する場合にのみ返します

基本的に私は膨大なリストを持っています:

# with (n) being a number in the hundreds of thousands or millions
def big_list(n):
return [ randrange(n) for i in range(n) ]

私がする必要があるのは、big_list(n)を使用して一度表示される要素のみを含む新しいリストを作成することsetです。私は本当に立ち往生しているので、正しい方向に私を向けることができるものは何でも素晴らしいでしょう!

4

5 に答える 5

4
l
Out[225]: [1, 2, 3, 45, 2, 2, 34, 5, 64, 5, 6, 45, 1, 1, 2, 3, 4, 6, 64, 3]

[x for x in l if l.count(x)==1]
Out[226]: [34, 4]

または、パフォーマンスが重要な場合は、コレクションからdefaultdictを使用します。

In [228]: import collections
     ...: d = collections.defaultdict(int)
     ...: for x in l: d[x] += 1
     ...: results = [x for x in l if d[x] == 1]
     ...: 

In [229]: results
Out[229]: [34, 4]
于 2012-10-14T22:25:21.517 に答える
1

カウントをdictに保存し、要素をでフィルタリングしますcount==1。dictキーはすでに一意です。

[アップデート]

テストされていません。バグを自分で修正してください。

def filter_single_elements(big_list):
    counter = {}
    for element in big_list:
        counter[element] = counter.get(element, 0) + 1
    new_list = []
    for element, count in counter.items():
        if count == 1:
            new_list.append(element)
    return new_list

これにより、新しいリストが返されます。代わりにジェネレーターを作成してみてください。

def filter_single_elements_iter(big_list):
    counter = {}
    for element in big_list:
        counter[element] = counter.get(element, 0) + 1
    for element, count in counter.items():
        if count == 1:
            yield element
于 2012-10-14T22:15:03.750 に答える
1

私が正しく理解していれば、大きなリストに1回だけ表示されるアイテムだけが必要です。これがあなたがそれをする方法です(あなたのリストはどこにxありますか):

>>> from collections import Counter
>>>
>>> x = [1, 1, 2, 3, 4, 5, 5, 6]
>>> y = []
>>>
>>> for item, count in Counter(x).most_common():
...     if count == 1:
...         y.append(item)
...
>>> y
[2, 3, 4, 6]

collections.Counterこれは2.7以降のみであることに注意してください。

于 2012-10-14T22:25:24.733 に答える
0

setコンストラクターでジェネレーター式を使用します。

def big_list(n):
    return set(randrange(n) for i in xrange(n))

編集

以下のコメントが指摘しているように、あなたは一度現れる要素を探します。カウンターオブジェクトをご覧になることをお勧めします。それらを使用して、大きなリスト内の要素を効率的に集計し、カウンターを繰り返して必要な要素を選別することができます。

于 2012-10-14T22:11:48.680 に答える
0

big_listをジェネレーターに変換し、itertoolsからunique_everseenレシピを適用します

于 2012-10-14T22:26:28.363 に答える