python - 根据列值将列表转换为元组字典

标签 python list dictionary tuples data-conversion

我正在尝试用 Python 转换以下列表:

headers = [ 'Col1','Col2','Col3','Col4' ]
data    = [[  '1','A','D','X']
           [  '2','A','D','X']  
           [  '3','A','C','X']  
           [  '1','B','F','X']
           [  '2','B','F','X'] ]

Col2 用作唯一键的元组字典,因此输出如下所示:

{ 
  'A': [( '1','D','X'),('2','D','X'),('3','C','X') ]
  'B': [( '1','F','X'),('2','F','X') ]
}

到目前为止,我已经成功地将它转置并压缩到一个以列为键的字典中,但我坚持在那里。

transpose_result = map(list, zip(*data))
data = dict(zip(headers, transpose_result))

你能帮忙吗? 提前致谢。

最佳答案

迭代 data 列表项,并以 row[1] 为键和 row[:1] + row[2:] 构建新字典 对于值(列表项):

>>> data = [
...     ['1','A','D','X'],
...     ['2','A','D','X'],
...     ['3','A','C','X'],
...     ['1','B','F','X'],
...     ['2','B','F','X'],
... ]

>>> d = {}
>>> for row in data:
...     d.setdefault(row[1], []).append(row[:1] + row[2:])
... 
>>> d
{'B': [['1', 'F', 'X'], ['2', 'F', 'X']],
 'A': [['1', 'D', 'X'], ['2', 'D', 'X'], ['3', 'C', 'X']]}

dict.setdefault用于在字典中没有键时用空列表填充字典,因此可以安全地完成 list.append 调用。


如果您使用 collections.defaultdict ,它可以更简单:

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> for row in data:
...     d[row[1]].append(row[:1] + row[2:])
... 
>>> d
defaultdict(<type 'list'>, {
    'A': [['1', 'D', 'X'], ['2', 'D', 'X'], ['3', 'C', 'X']],
    'B': [['1', 'F', 'X'], ['2', 'F', 'X']]})
>>> dict(d)  # to convert it back to dict
{'A': [['1', 'D', 'X'], ['2', 'D', 'X'], ['3', 'C', 'X']],
 'B': [['1', 'F', 'X'], ['2', 'F', 'X']]}

关于python - 根据列值将列表转换为元组字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33953355/

相关文章:

python - 如何以Python方式从嵌套字典中获取键

c++ - 如何有效地修改 std::map?

c++ - 使用 python 编写 C++ 脚本

python - 加速必须遍历整个列表的 Python 代码

Python hashlib - 列表理解的更新和摘要

python - 获取嵌套字典列表中的唯一键及其唯一值

python - 如何在Android中的Chaquopy python中导入numpy

python - 仅测量两个图像之间沿一个方向的位移

python - 如何使用字符串列表上的枚举来测试/运行循环的最后一次迭代

Python - 列表字典