1048

次のリストから一意の値を取得したい:

['nowplaying', 'PBS', 'PBS', 'nowplaying', 'job', 'debate', 'thenandnow']

私が必要とする出力は次のとおりです。

['nowplaying', 'PBS', 'job', 'debate', 'thenandnow']

このコードは機能します:

output = []
for x in trends:
    if x not in output:
        output.append(x)
print(output)

私が使用すべきより良い解決策はありますか?

4

30 に答える 30

1322

最初にリストをカンマで区切って適切に宣言します。リストをセットに変換することで、一意の値を取得できます。

mylist = ['nowplaying', 'PBS', 'PBS', 'nowplaying', 'job', 'debate', 'thenandnow']
myset = set(mylist)
print(myset)

さらにリストとして使用する場合は、次のようにしてリストに戻す必要があります。

mynewlist = list(myset)

もう1つの可能性は、リストの代わりに最初からセットを使用することです。次に、コードは次のようになります。

output = set()
for x in trends:
    output.add(x)
print(output)

指摘されているように、セットは元の順序を維持しません。それが必要な場合は、順序付きセットの実装を探す必要があります (詳細については、この質問を参照してください)。

于 2012-10-15T14:11:06.820 に答える
115

Python リスト:

>>> a = ['a', 'b', 'c', 'd', 'b']

一意のアイテムを取得するには、それをセットに変換するだけです (必要に応じて、リストに戻すことができます)。

>>> b = set(a)
>>> print(b)
{'b', 'c', 'd', 'a'}
于 2012-10-15T14:11:38.977 に答える
104

出力変数の型は何ですか?

Pythonセットが必要です。次のように出力を宣言します。

output = set()  # initialize an empty set

で要素を追加する準備が整い、要素output.add(elem)が一意であることを確認します。

警告: セットはリストの元の順序を保持しません。

于 2012-10-15T14:07:47.180 に答える
17

set - 一意の要素の順序付けられていないコレクション。要素のリストをセットのコンストラクターに渡すことができます。したがって、重複する要素を含むリストを渡すと、一意の要素を設定し、それをリストに変換してから、一意の要素を含むリストを取得します。パフォーマンスとメモリのオーバーヘッドについては何も言えませんが、小さなリストではそれほど重要ではないことを願っています。

list(set(my_not_unique_list))

シンプルで短い。

于 2015-02-06T12:16:09.753 に答える
12

リスト圧縮のみを使用した同順一意リスト。

> my_list = [1, 2, 1, 3, 2, 4, 3, 5, 4, 3, 2, 3, 1]
> unique_list = [
>    e
>    for i, e in enumerate(my_list)
>    if my_list.index(e) == i
> ]
> unique_list
[1, 2, 3, 4, 5]

enumeratesインデックスiと要素eを として与えtupleます。

my_list.indexの最初のインデックスを返しますe。最初のインデックスがそうでないi場合、現在の反復はリストeの最初ではありません。e

編集

パフォーマンスの観点から、これは良い方法ではないことに注意してください。これは、リスト圧縮のみを使用してそれを実現する方法にすぎません

于 2015-05-01T02:20:15.060 に答える
7

おまけとして、Counter一意の値と各値のカウントの両方を取得する簡単な方法があります。

from collections import Counter
l = [u'nowplaying', u'PBS', u'PBS', u'nowplaying', u'job', u'debate', u'thenandnow']
c = Counter(l)
于 2016-06-16T11:57:23.510 に答える
6

まず、あなたが示した例は有効なリストではありません。

example_list = [u'nowplaying',u'PBS', u'PBS', u'nowplaying', u'job', u'debate',u'thenandnow']

上記がリストの例であるとします。次に、次のレシピを使用して、必要に応じて一意の値を返し、順序を維持できる itertools サンプル ドキュメントを提供できます。ここでのイテラブルは example_list です

from itertools import ifilterfalse

def unique_everseen(iterable, key=None):
    "List unique elements, preserving order. Remember all elements ever seen."
    # unique_everseen('AAAABBBCCDAABBB') --> A B C D
    # unique_everseen('ABBCcAD', str.lower) --> A B C D
    seen = set()
    seen_add = seen.add
    if key is None:
        for element in ifilterfalse(seen.__contains__, iterable):
            seen_add(element)
            yield element
    else:
        for element in iterable:
            k = key(element)
            if k not in seen:
                seen_add(k)
                yield element
于 2012-10-15T14:12:00.333 に答える
6
def get_distinct(original_list):
    distinct_list = []
    for each in original_list:
        if each not in distinct_list:
            distinct_list.append(each)
    return distinct_list
于 2016-01-25T10:09:04.453 に答える
3
def setlist(lst=[]):
   return list(set(lst))
于 2014-06-16T08:25:16.413 に答える
2

セットは、順序付けされていない一意の要素のコレクションです。したがって、次のように set を使用して一意のリストを取得できます。

unique_list = list(set([u'nowplaying', u'PBS', u'PBS', u'nowplaying', u'job', u'debate', u'thenandnow']))
于 2016-05-31T15:17:38.137 に答える
1
  1. コードの最初で、出力リストを空として宣言するだけです。output=[]
  2. コードの代わりに、このコードを使用できますtrends=list(set(trends))
于 2014-02-04T00:31:34.513 に答える
0

私はこれが古い質問であることを知っていますが、これが私のユニークな解決策です: クラス継承!:

class UniqueList(list):
    def appendunique(self,item):
        if item not in self:
            self.append(item)
            return True
        return False

次に、アイテムをリストに一意に追加する場合は、UniqueList で appendunique を呼び出すだけです。リストから継承するため、基本的にはリストのように振る舞うので、index() などの関数を使用できます。また、true または false を返すため、追加が成功したか (一意の項目)、失敗したか (既にリスト)。

リストから項目の一意のリストを取得するには、項目を UniqueList に追加する for ループを使用します (その後、リストにコピーします)。

使用コードの例:

unique = UniqueList()

for each in [1,2,2,3,3,4]:
    if unique.appendunique(each):
        print 'Uniquely appended ' + str(each)
    else:
        print 'Already contains ' + str(each)

版画:

Uniquely appended 1
Uniquely appended 2
Already contains 2
Uniquely appended 3
Already contains 3
Uniquely appended 4

リストにコピー中:

unique = UniqueList()

for each in [1,2,2,3,3,4]:
    unique.appendunique(each)

newlist = unique[:]
print newlist

版画:

[1, 2, 3, 4]
于 2016-07-16T07:59:00.470 に答える
-1

長い配列の場合

s = np.empty(len(var))

s[:] = np.nan

for  x in  set(var):

    x_positions = np.where(var==x)

    s[x_positions[0][0]]=x


sorted_var=s[~np.isnan(s)]
于 2015-06-19T12:20:11.383 に答える
-4

この関数を試してください。コードに似ていますが、ダイナミック レンジです。

def unique(a):

    k=0
    while k < len(a):
        if a[k] in a[k+1:]:
            a.pop(k)
        else:
            k=k+1



    return a
于 2014-08-17T00:44:37.053 に答える