2013-08-07 7 views
1

Если у меня есть два списка:объединить два списка в словаре - питон

l_Y = [1, 2] 
l_Z = [3, 4] 

, что было бы самым простым способом для достижения этого результата ?:

[{'a':1, 'b':1, 'c':'Y'}, {'a':2, 'b':2, 'c':'Y'}... 
{'a':3, 'b':3, 'c':'Z'}, {'a':4, 'b':4, 'c':'Z'}] 

В принципе, если это список l_Y то величина с должна быть Y, если l_Z то значение должно быть с Z.

Я попытался это:

[{'a':nb, 'b':nb, 'c':letter} for nb in [l_Y, l_Z] letter='Y' if nb is l_Y else 'Z'] 

но получил «SyntaxError»

пь возвращает полный список вместо элемента в любом случае, так что не знаю, как это сделать ...

+3

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

ответ

2

Вы можете использовать следующее (который не требует ввода списков в словарь или условное выражение):

[{'a':v, 'b':v, 'c':c} 
    for (l, c) in zip((l_Y, l_Z), ('Y', 'Z')) 
     for v in l] 
3

Учитывая это, я бы

[{'a':val,'b':val,'c':('Y' if lst==l_Y else 'Z')} for lst in (l_Y,l_Z) for val in lst] 

честно говоря, хотя, как Blender упоминает в своем комментарии, вы, вероятно, будет лучше хранить свои списки в Словаре, например:

lists = {'Y':[1,2],'Z':[3,4]} 

и сделать

[{'a':val,'b':val,'c':key} for key,item in lists.items() for val in item] 

как результат

[{'a': 1, 'c': 'Y', 'b': 1}, {'a': 2, 'c': 'Y', 'b': 2}, {'a': 3, 'c': 'Z', 'b': 3}, {'a': 4, 'c': 'Z', 'b': 4}] 

который я предполагаю, что вы искали.

Метод dict имеет два преимущества: он упрощает обслуживание (только одно имя переменной, плавающее в пространстве имен), и делает код намного более чистым для целей получения/получения списка.

старый метод может потребовать от вас, чтобы сделать это, чтобы получить список назад из результатов:

lst_that_was_passed_in = globals()['l_'+<Y or Z>] 

в то время как новый метод требует только lists[<Y or Z>], что делает его легче поддерживать, уборщик на пространстве имен, и избежать КРАФТ.

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