2015-11-07 5 views
1

Я использую генераторы списков, как показано ниже. Я хотел бы знать, как я могу назначить разные тексты или значения для отдельных генераторов списков. В образце кода я могу сразу назначать значения для всех генераторов списков. Например, я хотел бы назначить для v, row1[3]="value 1", для k, row1[3]="value 2" и для m, row1[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 

ответ

1

Существует несколько различных способов назначения дополнительных значений различным генераторам. Самым простым было бы иметь словарь с ключом генератора или итерабельную с той же длиной, содержащей значения. Оба подхода приведены здесь:

Iterable

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 

Вы также можете иметь некоторый сложный сценарий, в котором дополнительное значение может быть создан с помощью какой-то другой функции, чем словарный поиск или индекс кортежа.

+0

Это прекрасно работает и значительно улучшает производительность. Спасибо!! – ketar

+0

Какой из них вы использовали? –

+0

Скорость оказалась примерно одинаковой для обоих, поэтому я пошел со словарем, потому что я больше знаком с ним, и мне было бы легче назначать более разные значения, если это необходимо. – ketar

Смежные вопросы