python - 使用嵌套列表解压 python 的值太多

标签 python nested-lists items

list_a = [['name1', 4.12]]
list_b = [['name2', 2, 'name4', 4, 'name4', 1, 'name4', 6, 'name2', 6]]

def data_sums(matrix):
  sums = defaultdict(int)

  for name, value in matrix:
    sums[name] += value 

  result = [[k,v] for k,v in sums.items()]
  return result

当我将 list_a 传递给 data_sums 时,它返回 [['name1', 4.12]](对于这种特定情况,它没有任何内容求和)。

当我将 list_b 传递给 data_sums 时,它返回一个错误:

for name, value in matrix: ValueError: too many values to unpack

我试图理解为什么会发生这种情况,但两个列表的嵌套结构似乎相同。

最佳答案

在传入 list_b 时出现 ValueError 的原因是:

for name, value in matrix:
    ...

Python 期望 some_list 中的元素能够被解包为两个变量; 名称list_a 也是如此。 list_a 有一个元素可以解包为两个变量 namevalue。但是,list_b 有一个元素包含两个以上的元素。这意味着它不能被分解成两个变量。因此,引发了异常。

显而易见的解决方案是将 list_b 重组为一个由元素组成的列表,每个元素都有两个元素。执行此操作的一般方法是使用 itertools 库中的 grouper 配方:

>>> from itertools import zip_longest
>>> 
>>> def grouper(iterable, n, fillvalue=None):
        args = [iter(iterable)] * n
        return zip_longest(*args, fillvalue=fillvalue)

>>> list_b = [['name2', 2, 'name4', 4, 'name4', 1, 'name4', 6, 'name2', 6]]
>>> list_b = list(grouper(list_b[0], 2))
>>> list_b
[('name2', 2), ('name4', 4), ('name4', 1), ('name4', 6), ('name2', 6)]
>>> 

解决此问题的另一种方法可读性差且通用性差,是使用列表切片:

>>> list_b = [['name2', 2, 'name4', 4, 'name4', 1, 'name4', 6, 'name2', 6]]
>>> inner = list_b[0]
>>> list_b = [(a, b) for (a, b) in zip(inner[::2], inner[1::2])]
>>> list_b
[('name2', 2), ('name4', 4), ('name4', 1), ('name4', 6), ('name2', 6)]
>>>  

关于python - 使用嵌套列表解压 python 的值太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48529957/

相关文章:

css - "Element ol not allowed as child of element pre in this context."

css - 对齐 div 中的元素?

xcode - 在 xcode 7 中使用 Mac App 预配置菜单项

python - 使用 pandas 中的 read_csv 时为特定列设置数据类型

python - Paradoxon : silent crash on Python's ctypes. CDLL 在导入时出现,但在直接运行时却没有 - 这怎么可能?

python - 在二维列表中交换 0 和 1 的最快方法

C# - DatagridView 和 ContextMenuStrip

python - 如何使用用户输入创建类实例?

python - 将 JSON 元素分离到 pandas 数据帧的列中

php - 从嵌套集中获取所有子类别并连接产品表