4

Pythonには、関数型パラダイムを通じてリストを一意にする方法がありますか?

入力:[1,2,2,3,3,3,4]

出力:([1,2,3,4]保存方法のために)

私は他の方法があることを知っていますが、機能的な方法はありません。

4

5 に答える 5

8

隣接するオカレンスを削除する必要がある場合は、次を試してください。

reduce(lambda x,y: x+[y] if x==[] or x[-1] != y else x, your_list,[])

1 つのオカレンスを除くすべてを削除する必要がある場合は、これを試してください。

reduce(lambda x,y: x+[y] if not y in x else x, your_list,[])
于 2012-12-07T06:21:24.037 に答える
3

あなたは試すことができます:

In [29]: a = [1,2,2,3,3,3,4]

In [30]: reduce(lambda ac, v: ac + [v] if v not in ac else ac, a, [])
Out[30]: [1, 2, 3, 4]

これはリストアキュムレータ(ac)を使用し、現在の値(v)がすでにリストにあるかどうかをチェックします。そうでない場合は、新しい要素を追加します。その場合は、リストを返すだけです。

また、これは完全に価値がない/醜い/見当違いであり、好奇心からより外れていました(そして確かにはるかにうまくいく可能性があります):

In [11]: a = [1,2,2,3,3,3,4]

In [12]: n = [None] * len(a)

In [13]: map(lambda b, c:(lambda i=n.__setitem__:(i(c,b)))() if b not in n else None, a, range(len(a)))
Out[13]: [None, None, None, None, None, None, None]

In [14]: filter(lambda x: x, n)
Out[14]: [1, 2, 3, 4]
于 2012-12-07T06:31:05.350 に答える
2

Python には順序付きセットはありませんが、OrderedDict. 純粋に機能的ではありませんが、ピンチで機能します。

>>> from collections import OrderedDict
>>> from itertools import repeat
>>> x = [1,2,2,3,3,3,4]
>>> OrderedDict(zip(x, repeat(None))).keys()
[1, 2, 3, 4]
于 2012-12-07T06:34:23.363 に答える
0

機能的パラダイムを通じてリストを一意にする

非常に簡単です。セットっぽいが、最初のリストと同じ順序で並べられたエンティティが必要です。

sorted(set(input), key=lambda element: input.index(element))

ボーナス機能: 初期配列に重複する要素がある場合、順序付けが存在するとは限りません ([1,2,2,1]場合のように)。提供されたコードは、同じように動作.index()します。また、1 回のソートは n 回のルックアップよりも高速になる場合があります (ただし、実際のデータのタイミングが必要です)。

于 2016-06-21T14:21:29.053 に答える
-2
try this one
list(set([1,2,2,3,3,3,4])) will definitely return [1,2,3,4]

as set contains unique elements

Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> list(set([1,2,2,3,3,3,4]))
[1, 2, 3, 4]
>>>
于 2012-12-07T06:20:53.490 に答える