我正在尝试创建一个颜色字典,其中整数映射到一种颜色。 在我的第一个列表l1中,它有177个项目,但只有5个唯一的整数(0到4)。 在第二个列表中,它有5种颜色。 我正在尝试创建一个字典,其中每种颜色将映射到一个唯一的整数。
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'}
我该如何解决这个问题?
答案 0 :(得分:1)
您需要一套,以便从l
获取所有唯一的数字:
print(dict(zip(set(l)),l2))
{0: '#000000', 1: '#FFFFFF', 2: '#FF0000', 3: '#00FF00', 4: '#0000FF'}
如果您总是希望对数字进行排序:
print(dict(zip(sorted(set(l)),l2)))
如果l
中只有五个值,您将始终只需要在l2
中只有5个唯一值,否则您将丢失数据。
答案 1 :(得分:0)
如果唯一整数是连续的,则可以使用enumerate()
:
>>> dict(enumerate(l2))
{0: '#000000', 1: '#FFFFFF', 2: '#FF0000', 3: '#00FF00', 4: '#0000FF'}
答案 2 :(得分:0)
您可以尝试使用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'}
答案 3 :(得分:0)
根据您提供的代码,我建议您考虑enum.Enum
or enum.IntEnum
object而不是字典(docs)。很难肯定地说,但IntEnum
在这里可能对你更好。
您可以通过以下方式创建IntEnum
:
l2=['#000000', '#FFFFFF', '#FF0000', '#00FF00', '#0000FF']
from enum import IntEnum
Color = IntEnum('Color', ' '.join(l2))
现在,所有颜色都已自动映射到整数值(从1开始;以1而不是0开头的原因是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
枚举还附带了一个内置字典对象(Color.__members__
),它将返回一个字典,其中成员名称为键,成员本身为值。
答案 4 :(得分:-1)
@Simeon Visser的答案是您提供的具体示例(使用0到4之间的整数)最简洁的答案。但是,如果您想要的是一系列像#{1}}这样的序列,其中所有项目都显示在原始列表中(甚至重复),这将无效。
然而,您的意图似乎是实际抓取列表中所有相应项目的颜色。如果是这种情况,那么可以做的是使用Simeon的答案并将其与原始列表结合使用,如下所示:
{0: '#0000FF', 2: '#FFFFFF', 3: '#00FF00'}
这将根据colorDict = dict(enumerate(l2))
colors = [colorDict[colorIndex] for colorIndex in l1]
中的整数序列将所有颜色映射到新列表。希望有所帮助。