TypeError:无法使用灵活类型执行reduce(字符串列表列表)

时间:2018-02-12 10:31:48

标签: python

我有一个列表r和一个列表l

r = get_r()
l = [['a', 'b'], ['a'], ['c']]

print('-')
[print(type(el)) for el in l];
print('-')
[print(type(el)) for el in r];

会给我们

-
<class 'list'>
<class 'list'>
<class 'list'>
-
<class 'list'>
<class 'list'>
<class 'list'>

让我们打印rl

print(l)
print(r)

会给我们

[['a', 'b'], ['a'], ['c']]
[['Schadenersatzrecht'], ['Abgabenrecht, Finanzrecht und Steuerrecht; Verfahrensrecht'], ['Europarecht']]

但现在我np.sum列出了这些名单:

np.sum(l)
np.sum(r)

我明白了:

['a', 'b', 'a', 'c']

但也是:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-158-0d0bce575128> in <module>()
----> 1 np.sum(r)

~/miniconda3/lib/python3.6/site-packages/numpy/core/fromnumeric.py in sum(a, axis, dtype, out, keepdims)
   1832             return sum(axis=axis, dtype=dtype, out=out, **kwargs)
   1833     return _methods._sum(a, axis=axis, dtype=dtype,
-> 1834                          out=out, **kwargs)
   1835 
   1836 

~/miniconda3/lib/python3.6/site-packages/numpy/core/_methods.py in _sum(a, axis, dtype, out, keepdims)
     30 
     31 def _sum(a, axis=None, dtype=None, out=None, keepdims=False):
---> 32     return umr_sum(a, axis, dtype, out, keepdims)
     33 
     34 def _prod(a, axis=None, dtype=None, out=None, keepdims=False):

TypeError: cannot perform reduce with flexible type

我完全不明白问题所在。即使在这些列表[print(type(el[0])) for el in r];中打印元素列表中的类型,也会给我<class 'str'>。这些类型是相同的 - 至少从我所知道的np.sum将无法在r上运行。

我不确定是否可以通过此处的内容了解问题所在。我可以提供的唯一信息是r来自解析的JSON - 但是,我不明白为什么这会影响结果。

1 个答案:

答案 0 :(得分:2)

使用np.sum展平您的列表是一个坏主意。在执行np.sum之前,两个列表都被强制转换为np数组类型,这些类型具有不同的dtypes(尽管这有点失败的原因)。

np.array(l).dtype != np.array(r).dtype

您通常不希望使用np.sum

使用列表推导简单地使用Pythonic方式列出列表列表:

l = [x for lst in l for x in lst]
r = [x for lst in r for x in lst]