列表理解创建了太多级别的嵌套列表

List Comprehension creates too many levels of nested lists

我将两个列表中的元素组合在一起,但被拉入的元素本身就是一个子列表。我怎样才能让它成为列表的第[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']]

您可以只向该内部列表理解添加一个索引访问器,这样您就可以获得该列表的第一个元素而不是整个列表:

#                                                     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 是引用列表类型的内置变量,覆盖该变量的值会在以后引起很多混乱。其次,这实际上更重要,这样的变量名给你关于它们内容的零信息。最好能适当地命名,这样你就知道它们包含什么以及它们的用途。

您可以使用字典来简化此列表的理解:

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

注意: 这只会工作 "types" 具有 "numbers" 的所有键。