2

我正在寻找从嵌套列表列表中创建两个字典:

M = {index of list: list}

N = {index of list: reversed list}

例子:

对于初学者,我有以下列表:

L =  [[20, 56], [23, 24], [23, 12], [22, 21], [26, 48], [26, 24]]

所以最终结果是:

M = {0: [56, 20], 1: [24, 23], 2: [12, 23], 3: [21, 22], 4: [48, 26], 5: [24, 26]}
N = {0: [20, 56], 1: [23, 24], 2: [23, 12], 3: [22, 21], 4: [26, 48], 5: [26, 24]}

我已经试过了:

M = {}
N = {}
for index, pair in enumerate(L):
    M[index] = pair
    N[index] = pair.reverse()

但这样做的结果是:

M = {0: [56, 20], 1: [24, 23], 2: [12, 23], 3: [21, 22], 4: [48, 26], 5: [24, 26]}
N = {0: [56, 20], 1: [24, 23], 2: [12, 23], 3: [21, 22], 4: [48, 26], 5: [24, 26]}

我通过这样做解决了它:

N[index] = pair[::-1]

但有人可以告诉我为什么会这样吗?

4

3 回答 3

5

list.reverse是就地操作,因为两个 dicts 中的键都指向同一个对象,因此所有引用都会受到影响。

>>> a = [1, 2, 3]
>>> b = a
>>> a.reverse()
>>> a
[3, 2, 1]
>>> b
[3, 2, 1]

要获取列表的新反向副本,您可以使用a[::-1]list(reversed(a))

>>> a = [1, 2, 3]
>>> b = a[::-1]
>>> b is a
False
>>> b = list(reversed(a))
>>> b is a
False

但是如果你想要一个反向列表,如果你想要一个迭代器,a[::-1]应该总是优先于.list(reversed(a))reversed(a)

于 2013-10-05T16:30:23.633 回答
0

正如@hcwhsa 所提到的,list.reverse将在适当的位置修改列表。如果您不想就地执行,可以执行以下操作:

>>> l[::-1]
[3, 2, 1]
>>> l
[1, 2, 3]
于 2013-10-05T16:36:30.010 回答
0

以相反顺序获取列表/字符串/元组的另一种方法是 a[::-1]。这会将 a 的元素从最后一个到第一个返回,作为一个副本——而不修改 a。

于 2013-10-05T16:38:35.757 回答