列表理解创建了太多级别的嵌套列表
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" 的所有键。
我将两个列表中的元素组合在一起,但被拉入的元素本身就是一个子列表。我怎样才能让它成为列表的第[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" 的所有键。