保留列表空间

时间:2016-02-08 06:01:30

标签: python list

我必须使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']]]

并没有任何问题。所以我认为问题来自于我如何保留名单。

我该如何解决这个问题。如果你不懂我的英语,请问。感谢。

2 个答案:

答案 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