python中列表的字典键*值

2024-04-25 20:40:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我的发言如下:

the_dict = {'1': 2,
 '2': 4,
 '3': 3,
 '8': 3,
 '9': 3,
 '10': 4,
 '14': 4}

我需要将键与值相乘以创建一个长的平面列表。 我的尝试如下,但它将10和14搞糟:

new_target = []
for k, v in zip(the_dict.keys(), the_dict.values()):
    new_target += list(k*v)

此代码生成: ['1', '1', '2', '2', '2', '2', '3', '3', '3', '8', '8', '8', '9', '9', '9', '1', '0', '1', '0', '1', '0', '1', '0', '1', '4', '1', '4', '1', '4', '1', '4']

该代码很接近,但由于10和14上的以下行为,它无法工作list("10" *2)产生['1', '0', '1', '0']而不是所需的['10', '10']

如何创建所需列表


Tags: theintarget列表newforkeyszip
2条回答

再加上M-Chen-3的答案,你也可以用list comprehension把它浓缩成这样:

new_target = [k for k, v in the_dict.items() for _ in range(v)]

您需要对代码进行两项更改:

  1. 既然可以用相同的结果迭代zip(the_dict.keys(), the_dict.values()),为什么还要迭代the_dict.items()

  2. 请注意,如果将字符串括在列表中,则不管字符串有多长:

print(["10"]*2)
# Prints ['10', '10']
print(["1"]*2)
# Prints ['1', '1']

另外,正如wim指出的,list函数调用是不必要的,因为您已经在创建一个列表

尽管如此,下面是更正的代码:

the_dict = {'1': 2,
 '2': 4,
 '3': 3,
 '8': 3,
 '9': 3,
 '10': 4,
 '14': 4}


new_target = []
for k, v in the_dict.items():
    new_target += [k]*v
    
print(new_target)
# Prints ['14', '14', '14', '14', '10', '10', '10', '10', '2', '2', '2', '2', '1', '1', 
# '3', '3', '3', '9', '9', '9', '8', '8', '8']

查看diggy的答案,获得一个简短的列表理解版本

相关问题 更多 >