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 回答