我必须使list2使用list1中的名称,但list1中的名称数量可能会有所不同。
foo = ['spam', 'eggs']
bar = [['spam', ['a', 'b']], ['eggs', ['c', 'd']]]
所以,我保留{/ 1}}
bar
并通过循环
从list1复制名称bar = [[None] * 2] * len(foo)
但结果是每个子列表中的名称都是这样的
bar[i][0] = foo[i]
我试图通过
保留bar = [['eggs', ['a', 'b']], ['eggs', ['c', 'd']]]
并没有任何问题。所以我认为问题来自于我如何保留名单。
我该如何解决这个问题。如果你不懂我的英语,请问。感谢。
答案 0 :(得分:4)
像这样创建第二个列表:
list2 = [[None]*2 for x in range(len(list1))]
或者另外,如果由于某种原因你不喜欢使用理解,你可以做
list2 = []
for x in range(len(list1)):
list2.append([None,None])
问题在于,当您执行类似
的操作时[listItem] * numCopies
您获得的列表包含相同 listItem 的 numCopies 副本,因此您的子列表都是相同的 - 当您更改一个时改变它们。
我建议的方式将创建包含相同内容的唯一列表(None
的两个副本)。因此,更改其中一个子列表不会改变任何其他子列表。
答案 1 :(得分:3)
Python list
类型用于连续序列,而不是数组。 (Python确实有一个数组类型,但list
不是那个。)
您展示的示例数据结构(一系列对,具有单个名称和一组值)将通过映射更好地服务于IMO。 Python的内置映射类型是dict
。
foo = ['spam', 'eggs']
bar = {
'spam': ['a', 'b'],
'eggs': ['c', 'd'],
}
因此无需在Python list
或Python dict
中保留空间。只需根据需要分配和删除项目,集合将管理自己的空间。
如果要设置映射bar
中的项目,并使用列表foo
中已有的值键入,则只需使用列表中的值作为dict中的键:
for name in foo:
value = determine_what_is_the_value_for(name)
bar[name] = value