Python:如何在新字典中反转列表而不反转原始列表

3

我有一个列表字典,例如:

dic = {"foo" : [1,3,5,6] , "bar" : [5, 3, 8, 4]}

我将尝试创建这些列表的反向字典,而不破坏原始数据。
我甚至尝试了如下操作:
list1 =  dic["foo"]
list2 = list1.reverse()
newDic = {}
newDic["foo"] = list2

但是看起来dic["A"]list1list2都指向同一个内存位置。换句话说,dic["foo"]在这个过程中也被反转了,这不是我想要的!!!有没有什么简单的方法解决这个问题?


1
你还有问题吗?如果没有,请将帮助过你的答案标记为解决方案。这将有助于未来可能遇到类似问题的其他人 :) - Parker
5个回答

2

如果你想要处理整个字典,可以试一下这个简洁的代码:

newDic = {key:value[::-1] for key,value in dic.iteritems()}

如果你只想处理一个列表,可以试一下这个:

list1 =  dic["foo"]
newDic = {}
newDic["foo"] = list1[::-1]

list.reverse() 会改变列表本身。尝试使用 list[::-1],它将返回一个反转后的新列表副本。


1

list1.reverse() 是一种原地翻转。相反,使用函数 reversed(list1),它不会修改被调用的列表。

具体来说:

dic = {"foo" : [1,3,5,6] , "bar" : [5, 3, 8, 4]}
list1 = dic["foo"]
list2 = list(reversed(list1))
newDic = {}
newDic["foo"] = list2

注意,reversed(list1) 返回一个生成器,而你需要完整的列表,所以在上面调用了 list

1

问题在于list2 = list1.reverse()

list.reverse() 方法会反转同一列表。

例如:

>>> a = [66.25, 333, 333, 1, 1234.5]
>>> a.reverse()
>>> a
[1234.5, 1, 333, 333, 66.25]

reverse的返回类型为None

>>> a = [66.25, 333, 333, 1, 1234.5]
>>> b = a.reverse()
>>> b
>>> print b
None

所以在你的情况下,list2 = None
另一个问题是,
你正在访问f00,而键是foo

抱歉!请忽略打字错误! - MrJanx
没问题。我想你得到了答案 :) - Nilesh

1
另一种方法:

list2 = []
for e in reversed(list1):
   list2.append(e)

list1.reverse() 反转原始列表。相反,你可以在 for 循环中实现。


0

你真正的问题在于创建列表的副本,这样你就可以做到

list2 = list(list1)
list2.reverse()

或者

list2 = list1[:]
list2.reverse()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接