将2个不等长的列表映射到字典

时间:2015-01-31 00:14:31

标签: python list dictionary scipy

我正在尝试创建一个颜色字典,其中整数映射到一种颜色。 在我的第一个列表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'}

我该如何解决这个问题?

5 个答案:

答案 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] 中的整数序列将所有颜色映射到新列表。希望有所帮助。