Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将2个长度不等的列表映射到字典_Python_List_Dictionary_Scipy - Fatal编程技术网

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

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中,它有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 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))