如果我有两个清单:
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那么c的值应该是Y,如果是l_Z则c的值应该是Z.
我试过了:
[{'a':nb, 'b':nb, 'c':letter} for nb in [l_Y, l_Z] letter='Y' if nb is l_Y else 'Z']
但得到了“SyntaxError”
nb无论如何都会返回完整列表而不是元素,所以不知道如何做到这一点......
答案 0 :(得分: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>]
,这样可以更容易维护,更清晰的命名空间,并避免骚扰。
答案 1 :(得分:2)
您可以使用以下内容(不需要将列表放入字典或条件表达式):
[{'a':v, 'b':v, 'c':c}
for (l, c) in zip((l_Y, l_Z), ('Y', 'Z'))
for v in l]