0

鉴于这样的事情:

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

4 回答 4

2

我不认为 longs 与它有任何关系: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()列表中的元素与字典中的对象完全相同。

(还要注意,因为字典没有排序,所以像这样按索引引用元素会给你带来麻烦,即使它有时似乎有效。)

于 2013-10-10T04:38:50.760 回答
2

DSM 的回答显示了您可以做些什么来解决您的问题(使用 dict 理解),但我想我会更多地解释一下为什么您当前的代码不起作用。

关键线是:

yesterday.values()[i] = v[0]

这没有任何用处。在 Python 2 中,dict.values()返回一个包含字典当前值副本的新列表。改变该列表不会改变字典。(在 Python 3 中,dict.values()返回一个直接绑定到字典的“视图”对象,但它既不可索引也不可变,因此尝试分配给其中的索引会引发异常。)

另一种方法是直接在字典中更改值:

yesterday[k] = v[0] # or use int(v[0]) if you still need to get rid of the longs
于 2013-10-10T04:50:56.000 回答
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()如果你想强制类型,也许在它周围。

于 2013-10-10T04:45:02.400 回答
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
于 2013-10-10T04:53:03.650 回答