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,那么 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']

但得到一个“语法错误”

nb 无论如何都会返回完整列表而不是元素,所以不知道该怎么做......

4

2 回答 2

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>]使其更易于维护、更清洁的命名空间并避免杂乱无章。

于 2013-08-07T22:33:16.853 回答
2

您可以使用以下内容(不需要将列表放入字典或条件表达式中):

[{'a':v, 'b':v, 'c':c} 
    for (l, c) in zip((l_Y, l_Z), ('Y', 'Z')) 
        for v in l]
于 2013-08-07T23:18:11.507 回答