使用iterated list元素在循环中命名变量

时间:2016-05-10 16:12:04

标签: python list

我浏览过相关问题,但找不到与我的用例完全匹配的问题。

我创建了两个列表(plistrlist):

list1 = [str(x).zfill(2) for x in range(101)]
plist = ['p{0}'.format(element) for element in list1]

rlist = [str(x).zfill(2) for x in range(51)]
rlist = ['r{0}'.format(element) for element in rlist]

每个列表如下所示:

>>> plist
['p00', 'p01', 'p02', 'p03'...'p100']

>>> rlist
['r00', 'r01', 'r02', 'r03'...'r50']

我已经设置了一些嵌套for循环来创建列表元素的排列。我们的想法是获取plist的每个元素,并将其与rlist的每个元素相结合。该过程会重复,直到plist用完为止。

for pitem in range(len(plist)):
    vsdata = []
    for ritem in range(pitem, len(rlist)):
        if pitem == ritem:
            print("skipped")
        else:
            item1 = plist[pitem]
            item2 = rlist[ritem]
            vsdata.append([str(item1),str(item2)])
            print(item1 + " and " + item2)

哪个收益率:

skipped
p00 and r01
p00 and r02
p00 and r03
p00 and r04
p00 and r05
p00 and r06
p00 and r07
p00 and r08
p00 and r09
p00 and r10
...
p01 and r02
p01 and r03
p01 and r04
p01 and r05
p01 and r06
p01 and r07
p01 and r08
p01 and r09
p01 and r10

你会注意到我在嵌套循环之前也声明了空列表vsdata。此列表应附加多组排列(例如,第一个plist元素与所有rlist元素组合)并保存,在嵌套循环再次开始之前,vsdata将被全部覆盖涉及plist的第二个元素的组合。

因此,我需要在此之前“导出”vsdata并使用plist的相关元素命名。

例如,在第二个循环运行两次后,我应该有两个vsdata列表;

>>> vsdata_p00
[['p00', 'r02'], ['p00', 'r03'], ['p00', 'r04'], ['p00', 'r05'], ['p00', 'r06'], ['p00', 'r07'], ['p00', 'r08'], ['p00', 'r09'], ['p00', 'r10'] ...

>>> vsdata_p01
[['p01', 'r02'], ['p01', 'r03'], ['p01', 'r04'], ['p01', 'r05'], ['p01', 'r06'], ['p01', 'r07'], ['p01', 'r08'], ['p01', 'r09'], ['p01', 'r10'] ...

我读过关于字典和集合的内容,但无法完全理解它们在这里的实现方式。最终,我希望将所有这些数据导出到csv中。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

使用字典这样的东西可能会起作用:

vsdatas = {}
for pitem in range(len(plist)):
    vsdata = []
    for ritem in range(pitem, len(rlist)):
        if pitem == ritem:
            print("skipped")
        else:
            item1 = plist[pitem]
            item2 = rlist[ritem]
            vsdata.append([str(item1),str(item2)])
            print(item1 + " and " + item2)
    vsdatas[plist[pitem]] = vsdata

要获取"p01"的排列列表,例如,只需访问vdatas["p01"]

通常,您不希望动态创建和命名变量。

答案 1 :(得分:0)

如前所述,您可以使用字典。此外,一切都可以在一行中完成(牺牲一点可读性):

vsdata = {'p'+str(p).zfill(2):[['p'+str(p).zfill(2), 'r'+str(r).zfill(2)] for r in range(p+1,51)] for p in range(101)}

print vsdata['p37']
# [['p37', 'r38'], ['p37', 'r39'], ['p37', 'r40'], ['p37', 'r41'], ['p37', 'r42'], ['p37', 'r43'], ['p37', 'r44'], ['p37', 'r45'], ['p37', 'r46'], ['p37', 'r47'], ['p37', 'r48'], ['p37', 'r49'], ['p37', 'r50']]