1

入力リストは次のとおりです。

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

私が期待する出力は次のようになります。

[[0, 'a'], [1, 'b'],  [1, 'b'], [2, 'c'], [2, 'c'], [3, 'd']]

map() を使用しようとしています

>>> map(lambda (index, word): [index, word], enumerate([['a', 'b', 'b', 'c', 'c', 'd']])
[[0, 'a'], [1, 'b'], [2, 'b'], [3, 'c'], [4, 'c'], [5, 'd']]

どうすれば期待される結果を得ることができますか?

編集:これはソートされたリストではありません。各要素のインデックスは、新しい要素に遭遇した場合にのみ増加します

4

4 に答える 4

6
>>> import itertools
>>> seq = ['a', 'b', 'b', 'c', 'c', 'd']
>>> [[i, c] for i, (k, g) in enumerate(itertools.groupby(seq)) for c in g]
[[0, 'a'], [1, 'b'], [1, 'b'], [2, 'c'], [2, 'c'], [3, 'd']]
于 2012-07-15T08:10:46.427 に答える
4
[
    [i, x]
    for i, (value, group) in enumerate(itertools.groupby(['a', 'b', 'b', 'c', 'c', 'd']))
    for x in group
]
于 2012-07-15T08:14:43.520 に答える
1

辞書式順序に基づいて用語をランク付けしたいようです。

input = ['a', 'b', 'b', 'c', 'c', 'd']
mapping = { v:i for (i, v) in enumerate(sorted(set(input))) }
[ [mapping[v], v] for v in input ]

これは、ソートされていない入力でも機能することに注意してください。

修正案が示唆しているように、最初の出現の順序に基づいてアイテムに番号を付けたい場合は、別のアプローチが必要です。以下は、不快なハッキーではありますが、短くて甘いものです。

[ [d.setdefault(v, len(d)), v] for d in [{}] for v in input ]
于 2012-07-15T08:12:56.243 に答える
1

リストがソートされている場合は、使用しますgroupby(jamylakの回答を参照)。そうでない場合は、リストを繰り返して、この手紙をすでに見たかどうかを確認してください。

a = ['a', 'b', 'b', 'c', 'c', 'd']
result = []
d = {}
n = 0
for k in a:
  if k not in d:
     d[k] = n
     n += 1
  result.append([d[k],k])

これが最も効果的なソリューションです。O(n)時間しかかかりません。

ソートされていないリストの使用例:

[[0, 'a'], [1, 'b'], [1, 'b'], [2, 'c'], [2, 'c'], [3, 'd'], [0, 'a']]

ご覧のとおり、ここでは入力リストと同じ順序のアイテムがあります。

最初にリストをソートするときは、O(n * log(n))の追加時間が必要です。

于 2012-07-15T08:13:39.573 に答える