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函数,学到了一些新东西:)