不支持的操作数类型 - 列表和列表

时间:2016-09-14 19:01:32

标签: python python-2.7

我使用的是较旧版本的python,它不支持减去dict。

spyOn($scope.testme, 'popover');
expect($scope.testme.popover).toHaveBeenCalled;

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

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]

它为 - :list和list返回不支持的操作数类型。 关于如何解决这个问题的任何想法

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

从列表中获取第一个值并将它们转换为int s。

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}

答案 2 :(得分:0)

你不能这样减去列表。

您可以使用字典comprehensio 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然后返回字符串的项目。如果您的数据实际上首先存储为整数,那么可能会更好。

答案 3 :(得分:0)

您是否尝试过查看d1 [key]和d2 [key]以了解错误是什么?如果没有,你应该拥有,这是调试代码的第一步:查看失败的地方以及失败所涉及的内容。

因此,您的问题的解释是以下d1 [' ab']不是数字,它是一个列表,列表['3']更精确。因此,编写d1['ab'] - d2['ab']会转换为['3'] - ['1'],这相当于执行list() - list(),并且由于错误状态无法减去两个列表,因此根本没有定义操作。所以你想要的是采取内部列表而不是列表本身,但要小心这些列表中你只有字符串而不是实际数字所以你必须转换字符串到一个数字,只有这样你才能完成预期的子行为。

但是所有这些都相当繁琐,而且我认为错误在于,当你编写代码时,你并没有完全低估字典的语法。您不必将数字作为字符串放在列表中以将它们放入dict中,您可以直接将数字放入:d1={'ab': 3, 'hij': 1200}是完全有效的python代码。然后当你拨打d1['ab']时,你会直接得到你期望的号码。