如何在字典中的列表中添加索引

时间:2019-02-22 06:05:21

标签: python dictionary

我在这里有一本字典:

dict = {'A':['1','1','1','1','1'], 'B':['2','2'], 'C':['3','3','3','3']}

获得以下结果的必要过程是什么?

dict = {'A':['1_01','1_02','1_03','1_04','1_05'], 'B':['2_01','2_02'], 'C':['3_01','3_02','3_03','3_04']}

我已经学习Python已有一段时间了,但是字典对我来说是新的。

6 个答案:

答案 0 :(得分:3)

如其他人所述,请勿使用内置关键字作为变量名,例如dict。为了您的简单起见,我保留了它。

这可能是最Python的方式(一行代码):

dict = {key:[x+"_0"+str(cnt+1) for cnt,x in enumerate(value)] for key,value in dict.items()}

您还可以依次遍历每个词典项,然后遍历每个列表项并手动更改列表名称,如下所示:

for key,value in dict.items():
    for cnt,x in enumerate(value):
        dict[key][cnt] = x+"_0"+str(cnt+1)

此外,正如其他人提到的那样,如果希望大于10的数字另存为1_10而不是1_010,则可以在列表理解中使用if / else语句...

dict = {key:[x+"_0"+str(cnt+1) if cnt+1 < 10 else x+"_"+str(cnt+1) for cnt,x in enumerate(value)] for key,value in dict.items()}

答案 1 :(得分:2)

使用enumerate遍历列表以跟踪索引:

d = {'A':['1','1','1','1','1'], 'B':['2','2'], 'C':['3','3','3','3']}

newd = {}
for k, v in d.items():
    newd[k] = [f'{x}_0{i}' for i, x in enumerate(v, 1)]

print(newd)

还有字典理解功能:

d = {k: [f'{x}_0{i}' for i, x in enumerate(v, 1)] for k, v in d.items()}

注意:请勿将字典命名为dict,因为它会掩盖内置字典。

答案 2 :(得分:2)

首先迭代键。

然后在要获得键的键上循环,例如'A'的值是['1','1','1','1','1'],那么我们可以在['1','1','1','1','1']处更改元素

enumerate()帮助您在index,value上进行迭代,然后根据您的预期输出,索引从零开始,将索引加1。由于您希望在每次计数前都拖尾0,所以我们做了'%02d'% (index+1)

赞:

dict = {'A':['1','1','1','1','1'], 'B':['2','2'], 'C':['3','3','3','3']}


for i in dict.keys(): #iterate on keys
    for index,val in enumerate(dict[i]): #took value as we have key in i
        element='%02d'% (index+1) #add trailing 0 we converted 1 to int 01
        dict[i][index]=val+"_"+ str(element) #assign new value with converting integer to string

print(dict)

输出:

{'A': ['1_01', '1_02', '1_03', '1_04', '1_05'], 'C': ['3_01', '3_02', '3_03', '3_04'], 'B': ['2_01', '2_02']}

答案 3 :(得分:2)

d= {'A':['1','1','1','1','1'], 'B':['2','2'], 'C':['3','3','3','3']}

{x:[j + '_'+ '{:02}'.format(i+1) for i,j in enumerate(y)] for x,y in d.items()}

答案 4 :(得分:1)

adict = {'A':['1','1','1','1','1'], 'B':['2','2'], 'C':['3','3','3','3'], 'D': '23454'}

newdict = {}
for i,v in adict.items():
    if isinstance(v, list):
        count = 0
        for e in v:
            count += 1
            e += '_0' + str(count)
            newdict[i] = newdict.get(i, [e]) + [e]
    else:
        newdict[i] = newdict.get(i, v)

print (newdict)
#{'A': ['1_01', '1_01', '1_02', '1_03', '1_04', '1_05'], 'B': ['2_01', '2_01', '2_02'], 'C': ['3_01', '3_01', '3_02', '3_03', '3_04'], 'D': '23454'}

此解决方案将在为字典分配值之前检查字典中的值是否为列表

答案 5 :(得分:1)

您可以使用dictcomp:

from itertools import starmap

d = {
    'A': ['1', '1', '1', '1', '1'],
    'B': ['2', '2'],
    'C': ['3', '3', '3', '3']
}

f = lambda x, y: '%s_%02d' % (y, x)
print({k: list(starmap(f, enumerate(v, 1))) for k, v in d.items()})
# {'A': ['1_01', '1_02', '1_03', '1_04', '1_05'], 'B': ['2_01', '2_02'], 'C': ['3_01', '3_02', '3_03', '3_04']}