如何为不同的列表重复代码块?

2024-09-30 14:32:05 发布

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

我有四个空列表和一本字典,如下所示:

argv1_a=[]
argv1_b=[]
argv2_a=[]
argv2_b=[]
dic={'1':['1','x','build'],'2':['x','8','demolish'],'3':['3','x','build'],'4':['6','10','demolish']}

以及一个代码块(它基本上将字典的值附加到列表中,并将其类型更改为int):

for i in dic.values():
    if i[2]=='build':
        if i[0]!='x':
            argv1_a.append(int(i[0]))
        else:
            argv1_a.append(i[0])
    elif i[2]=='demolish':
        if i[0]!='x':
            argv1_b.append(int(i[0]))
        else:
            argv1_b.append(i[0])
for i in dic.values():
    if i[2]=='build':
        if i[1]!='x':
            argv2_a.append(int(i[1]))
        else:
            argv2_a.append(i[1])
    elif i[2]=='demolish':
        if i[1]!='x':
            argv2_b.append(int(i[1]))
        else:
            argv2_b.append(i[1])

以下是列表的最终结果:

argv1_a=[1, 3]
argv1_b=['x', 6]
argv2_a=['x', 'x']
argv2_b=[8, 10]

有没有更好的方法不用编写相同的代码块,也不用第三方库?你知道吗


Tags: 代码inbuild列表forif字典else
2条回答

将值放在元组中,并使用for循环:

for (a, b, offset) in ((argv1_a, argv1_b, 0), (argv2_a, argv2_b, 1)):
    for i in dic.values():
        if i[2]=='build':
            if i[offset]!='x':
                a.append(int(i[offset]))
            else:
                a.append(i[offset])
        elif i[2]=='demolish':
            if i[offset]!='x':
                b.append(int(i[offset]))
            else:
                b.append(i[offset])

如果您只定义两个dict d1d2,其中包含键build的argv1_a/argv2_a和键demolish的argv1_b/argv2_b,您可以将代码简化如下

>>> argv1_a=[]
>>> argv1_b=[]
>>> argv2_a=[]
>>> argv2_b=[]
>>>  dic = {'1': ['1', 'x', 'build'], '2': ['x', '8', 'demolish'], '3': ['3', 'x', 'build'], '4': ['6', '10', 'demolish']}

>>> d1 = dict(build=argv1_a, demolish=argv1_b)
>>> d2 = dict(build=argv2_a, demolish=argv2_b)
>>> for x, y, key in dic.values():
...     d1[key].append(int(x) if x.isdigit() else x)
...     d2[key].append(int(y) if y.isdigit() else y)
... 

>>> print (argv1_a, argv1_b, argv2_a, argv2_b)
[1, 3] ['x', 6] ['x', 'x'] [8, 10]

相关问题 更多 >