Python按组映射列表中的值

Python按组映射列表中的值,python,list,mapping,Python,List,Mapping,我有以下资料: mylist = ['A','A','A','B','B','C'] colors = ['r','g','b','w','y'] 我希望mylist中的所有相同元素从颜色列表的开头获得相同的颜色,因此结果如下: result = ['r','r','r','g','g','b'] 颜色w和y将被忽略。似乎无法使映射正常工作 我试过: result = [[y for y in colors if set(mylist) == x] for x in mylist] 编辑

我有以下资料:

mylist = ['A','A','A','B','B','C']

colors = ['r','g','b','w','y']
我希望mylist中的所有相同元素从颜色列表的开头获得相同的颜色,因此结果如下:

result = ['r','r','r','g','g','b']
颜色w和y将被忽略。似乎无法使映射正常工作

我试过:

result = [[y for y in colors if set(mylist) == x] for x in mylist]

编辑:更清楚地说,['r'、'g'、'b'、'w'、'y']并不总是需要映射到ABCDEF。。。我的列表可能是['cat'、'cat'、'cat'、'dog'、'dog'、'bird']

您可以首先将映射创建为一个
dict
,然后使用它来获得结果

mylist = ['A', 'A', 'A', 'B', 'B', 'C']
colors = ['r', 'g', 'b', 'w', 'y']

mapping = dict(zip(
    sorted(set(mylist)),
    colors
))
print(mapping)  # {'A': 'r', 'B': 'g', 'C': 'b'}

result = [mapping[l] for l in mylist]
print(result)  # ['r', 'r', 'r', 'g', 'g', 'b']

如果您不关心颜色的顺序:

color_map = dict(zip(set(mylist), colors))
result = [color_map[item] for item in mylist]
from collections import OrderedDict

color_map = OrderedDict(zip(OrderedDict((item, True) for item in mylist), colors))
result = [color_map[item] for item in mylist]
如果您关心颜色的顺序:

color_map = dict(zip(set(mylist), colors))
result = [color_map[item] for item in mylist]
from collections import OrderedDict

color_map = OrderedDict(zip(OrderedDict((item, True) for item in mylist), colors))
result = [color_map[item] for item in mylist]

我建议使用字典来保留映射:

result = []
color_map = {}
idx = 0
for elt in mylist:
    if elt not in color_map.keys():
        color_map[elt] = colors[idx]
        idx += 1
    result.append(color_map[elt])

这也避免了单独迭代
颜色列表。

您可以使用计数器计算值在列表中出现的次数

然后使用该映射填充结果列表

from collections import Counter

mylist = ['A','A','A','B','B','C']
colors = ['r','g','b','w','y']
result = []
for idx, (_,v) in enumerate( Counter(mylist).items() ):
    result.extend( colors[idx] * v )
print(result)
输出:

['r', 'r', 'r', 'g', 'g', 'b']

注意:需要Python>3.7,否则无法保证dict的顺序-这也适用于此处依赖于
dict
的其他答案对我来说最简单的方法是:

mylist = ['A', 'A', 'A', 'B', 'B', 'C']
colors = ['r', 'g', 'b', 'w', 'y']
result = []

for i, item in enumerate(sorted(set(mylist))):  # sets doesn't maintain the order, so its sorted alphabetically
    result.extend(colors[i] * mylist.count(item))

print(result)

“['r'、'g'、'b'、'w'、'y']”是否总是映射到ABCDE,或者它取决于给定的
mylist
?dict自py3.7以来一直保持着秩序,所以继续使用
OrderedDict
有用吗?@azro我一定错过了,谢谢你。但是,
set(mylist)
不遵守顺序,因此我可以使用
orderedict
以方便使用,也可以编写我自己的uniq函数(性能更好)<代码>排序
因为在您的代码中,颜色取决于已排序的颜色,这些颜色可能有效,也可能无效。谢谢!从未使用过此zip函数,学到了一些新东西:)