9

一意のアイテムのみを含む Python でリスト内包表記を作成する方法はありますか?

私の元々のアイデアは、次のようなものを使用することでした: new_items = [unicode(item) for item in items]

ただし、後で重複する項目を省略する必要があることに気付きました。だから私はこの醜い怪物になってしまった:

unique_items = []
for item in items :
    unicode_item = unicode(item)
    if unicode_item not in unique_items :
        unique_items.append(unicode_item)

現在、これは単純なリスト内包表記よりもはるかにきれいではありません (そして読みやすくもありません)。では、上記のコードと同等のリスト内包表記を作成する方法はありますか?

また、順序も重要であるため、集合内包表記だけを使用することはできません。

4

4 に答える 4

18

順序集合はありませんが、OrderedDict を誤用する可能性があります。

from collections import OrderedDict
t = "never gonna give you up"
OrderedDict.fromkeys(t).keys()

与えます:

['n', 'e', 'v', 'r', ' ', 'g', 'o', 'a', 'i', 'y', 'u', 'p']
于 2012-10-01T22:14:37.280 に答える
10

あなたのオリジナルのアイデアは集合内包表記で機能します。

new_items = {unicode(item) for item in items}
于 2014-09-25T07:17:41.233 に答える
6

1つのライナーを短くすると、次のようになります。

s = "some string"
unique_items = [unicode(ch) for ch in sorted(set(s), key=s.index)]
于 2012-10-01T22:12:05.983 に答える
4

のようにヘルパー関数にします。

def unique_iter(iterable):
  seen = set()
  for item in iterable:
    if item in seen:
      continue
    seen.add(item)
    yield item

for ch in unique_iter("never gonna give you up"):
  print ch,

出力

nevrgoaiyup

于 2012-10-01T22:04:11.210 に答える