考虑到这样的事情:
yesterday = {'facebook_adgroups': [4634L], 'google_third_party_tags': [1790L]}
我想将恰好是列表/长格式的值转换为数字,以便稍后可以运行一些计算。我一直遇到一些不同的错误,或者改变只是“没有”。这是我的最后一次尝试:
for k, v in yesterday.iteritems():
i = 0
print v[0]
yesterday.values()[i] = v[0]
i += 1
答案 0 :(得分:2)
我不认为多头与它有任何关系:IIUC,你只是想将值(当前是一个元素的列表)转换为元素本身。你可以使用dict理解:
>>> yesterday = {'facebook_adgroups': [4634L], 'google_third_party_tags': [1790L]}
>>> yesterday = {k: v[0] for k,v in yesterday.iteritems()}
>>> yesterday
{'facebook_adgroups': 4634L, 'google_third_party_tags': 1790L}
这段代码:
yesterday.values()[i] = v[0]
不会“占用”,因为yesterday.values()
构造一个新的列表,与字典分开,包含字典值。 [i]
选择该新临时列表的i-th
元素,然后将其设置为v[0]
。原始yesterday
字典不受影响。但是,如果你改变了元素,例如附加到列表后,该更改将出现在字典中,因为.values()
列表中的元素与字典中的对象完全相同。
(另请注意,因为字典没有被排序,所以按索引引用元素就会让你陷入麻烦,即使它似乎有时会起作用。)
答案 1 :(得分:2)
DSM的答案显示了你可以做些什么来解决你的问题(使用字典理解),但我想我会更多地解释为什么你当前的代码不起作用。
关键是:
yesterday.values()[i] = v[0]
这没有任何用处。在Python 2中,dict.values()
返回一个新列表,其中包含字典当前值的副本。改变该列表不会改变字典。 (在Python 3中,dict.values()
返回一个直接绑定到字典的“view”对象,但它既不可索引也不可变,因此尝试分配给它中的索引会引发异常。)
另一种方法是直接在字典中更改值:
yesterday[k] = v[0] # or use int(v[0]) if you still need to get rid of the longs
答案 2 :(得分:1)
我相信以下调整可以满足您的要求:
当您将值分配给相应的键时,它会保留long
特征:
yesterday = {'facebook_adgroups': [4634L], 'google_third_party_tags': [1790L]}
for k, v in yesterday.iteritems():
i = 0
print v[0]
yesterday[k] = v[0]
i += 1
print yesterday
结果
4634
1790
{'facebook_adgroups': 4634L, 'google_third_party_tags': 1790L}
请注意,值仍为L
。但是当我改变作业时:
yesterday[k] = int(v[0])
输出变为
{'facebook_adgroups': 4634, 'google_third_party_tags': 1790}
我会自由地承认这“不是非常Pythonic” - 但它似乎确实起到了作用。
重新阅读你的问题后,似乎我回答了标题中所述的问题 - 但现在我更仔细地看,这是你正在努力解决的问题。
我强烈提醒你,如果你开始使用键/值对,那么尝试使用数字索引就会充满危险。事情可能不是你想的顺序,项目可能会丢失等等。除非你专门按照已知的顺序分配,默认值为缺失值,否则有一天会出错 - 你会在几个小时内找到错误。最好做一些像
这样的事情yNum[0] = yesterday['facebook_adgroups']
yNum[1] = yesterday['google_third_party_tags']
等。如果您想要强制输入类型,可能在int()
周围。
答案 3 :(得分:0)
我无法理解你的问题。但根据我对你的问题的理解,
yesterday = {'facebook_adgroups': [4634L], 'google_third_party_tags': [1790L]}
for k,v in yesterday.items():
print '%s : %s' % (k, map(int,v)[0])
for k,v in yesterday.items():
print '%s : %s' % (k, int(v[0]))
以上两种方式都会为您提供相同的输出
输出:
facebook_adgroups : 4634
google_third_party_tags : 1790
facebook_adgroups : 4634
google_third_party_tags : 1790