将具有长数值的字典转换为常规整数值

时间:2013-10-10 04:34:20

标签: python dictionary long-integer

考虑到这样的事情:

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

4 个答案:

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