List Comprehension创建了太多级别的嵌套列表

时间:2015-01-19 21:06:14

标签: python python-2.7 list-comprehension

我将两个列表中的元素组合在一起,但是被拉入的元素本身就是一个子列表。我怎样才能把它列为清单的第[2]项?

我的代码:

list =  [["pineapple", 10], ["cherry", 20], ["Carrot", 13], ["plum", 12]]
list1 = [["pineapple", 'Fruit'], ["cherry", 'Fruit'],["Carrot", 'Vegetable'],["plum", 'Fruit'],["Pepper", 'Vegetable']]

list = [[v1[0], v1[1], [v2[1] for v2 in list1 if v2[0] == v1[0]]] for v1 in list]

print list

我的输出:

[['pineapple', 10, ['Fruit']], ['cherry', 20, ['Fruit']], ['Carrot', 13, ['Vegetable']], ['plum', 12, ['Fruit']]]

期望的输出:

[['pineapple', 10, 'Fruit'], ['cherry', 20, 'Fruit'], ['Carrot', 13, 'Vegetable'], ['plum', 12, 'Fruit']]

2 个答案:

答案 0 :(得分:5)

你可以只为该内部列表理解添加一个索引访问器,因此你得到该列表的第一个元素而不是整个列表:

#                                                     This part is new
#                                                            ↓↓↓
>>> [[v1[0], v1[1], [v2[1] for v2 in list1 if v2[0] == v1[0]][0]] for v1 in list]
[['pineapple', 10, 'Fruit'], ['cherry', 20, 'Fruit'], ['Carrot', 13, 'Vegetable'], ['plum', 12, 'Fruit']]

由于您基本上在查找水果类别,因此可以将list1放入字典中。这允许您只需查找一个值,而无需遍历整个列表:

# to convert the existing `list1`
>>> categories = dict(list1)

# or specify it directly as a dictionary:
>>> categories = {'pineapple': 'Fruit', 'cherry': 'Fruit', 'Carrot': 'Vegetable', 'plum': 'Fruit', 'Pepper': 'Vegetable'}

然后您可以使用索引查找类别。例如categories['pineapple']为您提供'Fruit'。所以你可以在列表理解中使用它:

>>> [[v1[0], v1[1], categories[v1[0]]] for v1 in list]
[['pineapple', 10, 'Fruit'], ['cherry', 20, 'Fruit'], ['Carrot', 13, 'Vegetable'], ['plum', 12, 'Fruit']]

最后,请注意:您不应仅仅为list命名变量。首先,list是引用列表类型的内置变量,并且覆盖该变量的值可能会在以后引起很多混淆。其次,这实际上更重要,这些变量名称可以为您提供有关其内容的零信息。如果你恰当地命名它会更好,所以你知道它们包含什么以及它们用于什么。

答案 1 :(得分:0)

您可以使用词典来简化列表理解:

numbers = dict(list)
types = dict(list1)
result = {key:[numbers[key], types[key]] for key in numbers.keys()}

注意: 这只适用于"类型"拥有"数字"。

的所有键