为列表生成器结果分配不同的值

Assign differing values to list generator results

我正在使用列表生成器,如下所示。我想知道如何为各个列表生成器分配不同的文本或值。在示例代码中,我一次只能为所有列表生成器赋值。例如,我想分配 vrow1[3]="value 1"krow1[3]="value 2"mrow1[3]="value 3". 如何实现那个?

v = (item for item in propadd if item[0]==row1[8] and harversine(custx,custy,item[2],item[3])<1500)
k = (item for item in custadd if item[0]==row1[4])
m = (item for item in numlist if re.search(r"^[0-9]+(?=\s)",row1[0]) is not None and item[0]==re.search(r"^[0-9]+(?=\s)",row1[0]).group())
for gen in (v, k, m):
    l = list(gen) 
    if len(l) == 1:
        row1[1] = l[0][1]
        row1[2] = l[0][2]
        break

有几种不同的方法可以为不同的生成器分配附加值。最简单的方法是使用生成器键入的字典或包含值的相同长度的可迭代对象。此处显示了两种方法:

可迭代

v = (item for item in propadd if item[0]==row1[8] and harversine(custx,custy,item[2],item[3])<1500)
k = (item for item in custadd if item[0]==row1[4])
m = (item for item in numlist if re.search(r"^[0-9]+(?=\s)",row1[0]) is not None and item[0]==re.search(r"^[0-9]+(?=\s)",row1[0]).group())
extraValues = ('value 1', 'value 2', 'value3')
for ind, gen in enumerate((v, k, m)):
    l = list(gen) 
    if len(l) == 1:
        row1[1] = l[0][1]
        row1[2] = l[0][2]
        row1[3] = extraValues[ind]
        break

词典

v = (item for item in propadd if item[0]==row1[8] and harversine(custx,custy,item[2],item[3])<1500)
k = (item for item in custadd if item[0]==row1[4])
m = (item for item in numlist if re.search(r"^[0-9]+(?=\s)",row1[0]) is not None and item[0]==re.search(r"^[0-9]+(?=\s)",row1[0]).group())
extraValues = {v: 'value 1',
               k: 'value 2',
               m: 'value3')
for gen in (v, k, m):
    l = list(gen) 
    if len(l) == 1:
        row1[1] = l[0][1]
        row1[2] = l[0][2]
        row1[3] = extraValues[gen]
        break

您还可能遇到一些复杂的情况,其中额外的值可能由字典查找或元组索引以外的某些函数生成。