2016-09-14 72 views
-3

我使用的是不支持减去字典的python的老版本。不支持的操作数类型 - 列表和列表

d1={'ab': ['3'], 'hij': ['1200']} 
d2={'ab': ['1'], 'hij': ['600']} 

基本上我的代码如下所示:

for key in d1.keys(): 
     if key in d2: 
      d3[key]=d1[key]-d2[key] 

输出应该像

d2={'ab': ['2'], 'hij': ['600']} 

它返回不支持的操作数类型 - :列表和列表。 如何解决这个

+0

请发布d1和d2的内容​​。 – karlosss

+3

你想从另一个列表中减去一个列表。你期望得到什么结果? – mgilson

+0

另一个包含键值差异的列表 – identical123456

回答

0

从列表中取得第一个值,并将其转换为int秒。

d1 = {'ab': ['3'], 'hij': ['1200']} 
d2 = {'ab': ['1'], 'hij': ['600']} 
d3 = {} 

for key in d1.keys(): 
    if key in d2: 
     d3[key] = int(d1[key][0]) - int(d2[key][0]) 

print d3 

输出:

{'hij': 600, 'ab': 2} 

支持花车,你需要转换为float。如果你想有4位数的精度,那么你可以使用round函数。

d1 = {'ab': ['3.2462353'], 'hij': ['1200.223353']} 
d2 = {'ab': ['1.346733'], 'hij': ['600.252341']} 
d3 = {} 

for key in d1.keys(): 
    if key in d2: 
     num1 = float(d1[key][0]) 
     d3[key] = round(float(d1[key][0]) - float(d2[key][0]), 4) 

print d3 

输出:

{'hij': 599.971, 'ab': 1.8995} 
+0

不得不使用float,因为我也有一些非整数。无论如何,只返回幅度和只有4位有效数字,而不是我目前正在获取的很多。此外,我不认为它的工作,因为我得到所有键 – identical123456

+0

相同的差异值更新为支持4位精度浮点数。是的,它的工作。检查我输入的输出。这是正确的。 – Jarvis

+0

不确定你的意思是相同的区别。 – Jarvis

0

任何想法请尝试以下操作:

d1={'ab': ['3'], 'hij': ['1200']} 
d2={'ab': ['1'], 'hij': ['600']} 
d3={} 
for key in d1.keys(): 
    if key in d2: 
     d3[key] = [str(int(d1[key][i]) - int(d2[key][i])) for i in xrange(len(d1[key]))] 
print d3 
+0

它说无效的语法 – identical123456

+0

更正。现在就试试。 – galah92

+0

不支持的操作数类型为 - :str和str – identical123456

0

你不能减去名单,像这样。

你也可以使用一个字典理解中 n和再zip的名单,这样你就可以减掉自己的内容:

d1={'ab': ['3'], 'hij': ['1200']} 
d2={'ab': ['1'], 'hij': ['600']} 

d3 = {k: ['{}'.format(int(i) - int(j)) for i, j in zip(d1[k], d2[k])] for k in d1} 
print(d3) 
# {'hij': ['600'], 'ab': ['2']} 

注意这里使用字符串格式化铸造到int,然后返回到字符串的项目。如果您的数据实际上是作为整数存储在首位,那么可能会更好。

+0

说我无效的语法 – identical123456

+0

我想相信你没有复制'>>>' –

0

你有没有试过看d1 [key]和d2 [key]来了解错误的含义?那么如果没有,你应该有,这是调试代码的第一步:查找失败的位置以及失败的原因。

因此,您的问题的解释是以下d1 ['ab']不是一个数字,它是一个列表,该列表是更精确的['3']。所以写d1['ab'] - d2['ab']转化为['3'] - ['1'],这将是相当于做list() - list()和错误状态是没有办法。减去两个列表,根本就没有定义的操作。所以,你需要的是采取什么是列表,而不是名单本身,而是被那些列表里面小心你只有没有实际的数字,所以你必须将字符串转换为数字,只有这样,你会能够做预期的子事务。

但这一切是相当繁琐和我假设的错误是,你没有完全以undersand dictionnaries的语法,当你写的代码。您不必将数字作为字符串放在列表中并将其放入字典中,您可以直接将该数字作为字符输入:d1={'ab': 3, 'hij': 1200}是完全有效的Python代码。然后当您拨打d1['ab']时,您可以直接获得您期望的号码。

+0

谢谢你的解释。我用“d1.setdefault(name,[])。append(number)”来获得字典。将它改为append(float(number))应该可以做到这一点 – identical123456

相关问题