如何在Python中将一个列表映射到另一个列表?

19
['a','a','b','c','c','c']

转换为

[2, 2, 1, 3, 3, 3]
并且
{'a': 2, 'c': 3, 'b': 1}

1
我不明白这个问题。 - Federer
3
增加至少一行描述会非常有帮助。 - Juergen
这个问题在过去的一周里每天都被问到。 - SilentGhost
8个回答

42
>>> x=['a','a','b','c','c','c']
>>> map(x.count,x)
[2, 2, 1, 3, 3, 3]
>>> dict(zip(x,map(x.count,x)))
{'a': 2, 'c': 3, 'b': 1}
>>>

4
这个结果看起来很漂亮,但它有潜在的 O(n^2) 的运行时间行为。 - Juergen
2
但是他从来没有提到性能问题... 这解决了问题,如果它太低效,那就是另一个要解决的问题。 - chills42
3
没错 - 但你有没有意识到,当你陷入O(n^2)的陷阱时会发生什么?我曾经经历过这种情况,当一个简单的算法应用于大型数据集时,程序性能完全崩溃,因为算法的行为是这样的。 - Juergen
4
放松一下。你很可能一直在编写O(n^3)和O(2^n)算法,甚至没有注意到它们被执行了。只有在出现这些问题时才需要解决它们。 - Wim

12

这段代码应该会给出以下结果:

from collections import defaultdict

myDict = defaultdict(int)

for x in mylist:
  myDict[x] += 1

当然,如果您想要中间的列表结果,只需从字典获取值(mydict.values())即可。


7
在 Python ≥2.7 或者 ≥3.1 版本中,我们可以使用内置的数据结构 collections.Counter 对列表进行计数。
>>> l = ['a','a','b','c','c','c']
>>> Counter(l)
Counter({'c': 3, 'a': 2, 'b': 1})

后续构建[2, 2, 1, 3, 3, 3]很容易。

>>> c = _
>>> [c[i] for i in l]   # or map(c.__getitem__, l)
[2, 2, 1, 3, 3, 3]

6
使用set来避免重复计数,使用列表方法count来计算它们的数量,将它们存储在dict中,其中项目作为键而出现次数作为值。
l=["a","a","b","c","c","c"]
d={}

for i in set(l):
    d[i] = l.count(i)

print d

输出:

{'a': 2, 'c': 3, 'b': 1}

对我来说,这是最容易理解/实现的。你知道它是否比使用集合计数器慢吗? - zach
对于这样微不足道的例子,实现它们并计时。不要相信我的猜测。或者更好的是,根本不用关心速度;你使用Python是为了简单性,而不是性能。 - Mizipzor

5
a = ['a','a','b','c','c','c']
b = [a.count(x) for x in a]
c = dict(zip(a, b))

我已经包含了Wim的答案。好主意。


c = dict(zip(a, b)) 可以用于计算 c - Wim

3
第二个可能只是这样
dict(zip(['a','a','b','c','c','c'], [2, 2, 1, 3, 3, 3]))

2

首先:

l = ['a', 'a', 'b', 'c', 'c', 'c']

map(l.count, l)


1
d=defaultdict(int)
for i in list_to_be_counted: d[i]+=1
l = [d[i] for i in list_to_be_counted]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接