Python 将2个长度不等的列表映射到字典
我正在尝试创建一个颜色字典,其中整数映射到一种颜色。 在我的第一个列表l1中,它有177个项,但只有5个唯一的整数(0到4)。 在第二个列表中,它有5种html颜色。 我正在尝试创建一个字典,其中每种颜色将映射到一个唯一的整数Python 将2个长度不等的列表映射到字典,python,list,dictionary,scipy,Python,List,Dictionary,Scipy,我正在尝试创建一个颜色字典,其中整数映射到一种颜色。 在我的第一个列表l1中,它有177个项,但只有5个唯一的整数(0到4)。 在第二个列表中,它有5种html颜色。 我正在尝试创建一个字典,其中每种颜色将映射到一个唯一的整数 l1=[3 2 3 3 0 2 4 4 2 3 2 2 4 0 3 2 2 2 1 3 2 3 2 2 2 0 3 1 0 2 2 2 4 2 4 2 0 2 0 4 0 4 2 0 2 2 2 4 1 3 2 2 2 1 0 3 3 2 0 2 3 4 1
l1=[3 2 3 3 0 2 4 4 2 3 2 2 4 0 3 2 2 2 1 3 2 3 2 2 2 0 3 1 0 2 2 2 4 2 4 2 0
2 0 4 0 4 2 0 2 2 2 4 1 3 2 2 2 1 0 3 3 2 0 2 3 4 1 0 0 1 3 1 3 1 4 3 4 1
4 0 2 3 2 0 4 1 3 0 0 4 0 4 0 2 2 1 2 2 1 0 4 4 3 1 3 2 2 2 4 4 2 0 3 4 4
0 3 4 3 4 2 2 2 3 3 1 0 2 3 1 1 4 0 1 2 0 0 2 0 0 0 0 2 3 1 0 3 3 3 2 2 3
3 0 0 0 2 0 3 2 0 0 0 2 2 0 4 3 3 0 2 2 3 2 3 3 0 2 0 4 3]
l2=['#000000', '#FFFFFF', '#FF0000', '#00FF00', '#0000FF']
这是我的密码:
color_map=dict(zip(l1,l2))
print color_map
然而,我得到了一本完整的词典:
{0: '#0000FF', 2: '#FFFFFF', 3: '#00FF00'}
如何解决此问题?如果唯一整数是连续的,则可以使用
enumerate()
:
您需要一个集合,以便从
l
获取所有唯一的数字:
print(dict(zip(set(l)),l2))
{0: '#000000', 1: '#FFFFFF', 2: '#FF0000', 3: '#00FF00', 4: '#0000FF'}
如果您始终希望对数字进行排序:
print(dict(zip(sorted(set(l)),l2)))
如果在
l2
中只有五个值,则始终需要在l
中只有五个唯一值,否则将再次丢失数据 您可以尝试使用set()
获取l1的所有唯一整数:
l1_list=list(set([3,2,3,3,0,2,4,4,2,3,2,2,4,0,3,2,2,2,1,3,2,3,2,2,2,0,3,1,0,2,2,2,4,2,4,2,0,2,0,4,0,4,2,0,2,2,2,4,1,3,2,2,2,1,0,3,3,2,0,2,3,4,1,0,0,1,3,1,3,1,4,3,4,1,4,0,2,3,2,0,4,1,3,0,0,4,0,4,0,2,2,1,2,2,1,0,4,4,3,1,3,2,2,2,4,4,2,0,3,4,4,0,3,4,3,4,2,2,2,3,3,1,0,2,3,1,1,4,0,1,2,0,0,2,0,0,0,0,2,3,1,0,3,3,3,2,2,3,3,0,0,0,2,0,3,2,0,0,0,2,2,0,4,3,3,0,2,2,3,2,3,3,0,2,0,4,3]))
l2=['#000000', '#FFFFFF', '#FF0000', '#00FF00', '#0000FF']
color_map=dict(zip(l1_list,l2))
print color_map
输出:
{0: '#000000', 1: '#FFFFFF', 2: '#FF0000', 3: '#00FF00', 4: '#0000FF'}
@对于您提供的特定示例,Simeon Visser的答案是最简洁的(使用0到4的整数)。但是,如果您想要的是一系列#s,比如
{0:'0000FF',2:'ffffffff',3:'00FF00'}
,其中所有项目都显示在原始列表中(甚至重复),那么这是行不通的
然而,您的意图似乎是实际获取列表中所有对应项的颜色。如果是这种情况,您可以使用Simeon的答案,并将其与原始列表相结合,如下所示:
colorDict = dict(enumerate(l2))
colors = [colorDict[colorIndex] for colorIndex in l1]
这将根据
l1
中的整数序列将所有颜色映射到新列表。希望能有所帮助。根据您介绍的代码,我建议考虑使用一个而不是字典()。很难说清楚,但在这里,IntEnum
可能更适合您
您可以通过以下方式创建您的IntEnum
:
l2=['#000000', '#FFFFFF', '#FF0000', '#00FF00', '#0000FF']
from enum import IntEnum
Color = IntEnum('Color', ' '.join(l2))
现在,您的所有颜色都已自动映射到一个整数值(从1开始;从1开始而不是从零开始的原因是,Enum
的所有成员计算为True
)
您可以迭代Color
并访问成员名称和成员值,这与使用字典的方式类似:
for color in Color:
print(color.name, color.value)
请注意,当您像在字典中一样通过键访问成员时,会返回IntEnum
成员对象本身,而不是它映射到的整数:
print(Color['#000000'])
…但是,这可能对您不重要,因为它是一个IntEnum
,成员对象的行为类似于整数,包括出于比较等目的:
for color in Color:
if color == 1:
print(color.name, ' is 1!')
print(Color['#000000'] == 1) # will print either True or False
c = Color(1)
print(c) # will print the Color member c, which is mapped to 1
以上是我认为这可能是一个更好的选择的关键原因。您的l1
列表中充满了表示颜色的整数。理想的做法是用Color
成员而不是整数填充它:
for index, number in enumerate(l1):
l1[index] = Color(number)
但是,如果您不能/不想这样做,您仍然可以将整数与Color
成员进行比较(我假设您对“相加”、“相乘”等颜色没有任何兴趣)
所以,你可以这样做:
print(any(number == Color['#000000'] for number in l1))
Color
enum还附带了一个内置字典对象(Color.\uu members\uuu
),该对象将返回一个字典,其中成员名称作为键,成员本身作为值 为了使用zip
并获得完美匹配,您需要两个长度相同的列表/集合。这将始终获得0,1,2,3,4
而不一定是来自l@PadraicCunningham:是的,但第一个列表中的值可能总是这样的数字,因此这是最简单的解决方案。如果不是,请使用其他解决方案之一。是的,但是5,6,7,8,9
也是连续的数字。是的,连续的,从0
开始-这就是我的意思,根据我们在给定的l1
列表中碰巧看到的情况。
print(any(number == Color['#000000'] for number in l1))