【问题标题】:How to convert a list into a dictionary which uses tuple as a key如何将列表转换为使用元组作为键的字典
【发布时间】:2019-06-08 20:02:26
【问题描述】:

我想用 Panda 读取一个 excel 表,并创建一个元组列表。然后,我想将列表转换为以元组为键的字典。我该怎么做?

这是我正在阅读的表格;

A B 0.6

A C 0.7

C D 1.0

C A 1.2

D B 0.7

D C 0.6

这是我阅读表格的方式;

import pandas as pd

df= pd.read_csv("my_file_name.csv", header= None)  

my_tuple = [tuple(x) for x in df.values]

现在,我想要以下结构。

my_data =  {("A", "B"): 0.6,

            ("A", "C"): 0.7,

            ("C", "D"): 1,

            ("C", "A"): 1.2,

            ("D", "B"): 0.7,

            ("D", "C"): 0.6}

【问题讨论】:

  • 查看 Martjin 在dictionary ordering 上的相关帖子,以及为什么您在 Python 3.5 中看到不同的排序

标签: python pandas list dictionary


【解决方案1】:

set_index 和 to_dict

df.set_index(['a', 'b']).c.to_dict()

{('A', 'B'): 0.6,
 ('A', 'C'): 0.7,
 ('C', 'A'): 1.2,
 ('C', 'D'): 1.0,
 ('D', 'B'): 0.7,
 ('D', 'C'): 0.6}

选项2:使用 zip 的另一种解决方案

dict(zip(df[['A', 'B']].apply(tuple, 1), df['C']))

选项 3:

k = df[['A', 'B']].to_records(index=False).tolist()
dict(zip(k, df['C']))

【讨论】:

  • 感谢您的回答。因此,我将读取表格的方式更新为 df= pd.read_csv("my_file_name.csv", header= None, names= ["A","B","C"]) 。然后,我调用以下函数 print(df.set_index(['A', 'B']).C.to_dict())。我的输出看起来像 {('D', 'C'): 0.6, ('A', 'C'): 0.7, ('D', 'B'): 0.7, ('C', 'A') :1.2,('A','B'):0.6,('C','D'):1.0}。你知道为什么顺序会改变吗?
  • 您可以在使用列名读取数据后使用 df.head() 更新您的帖子吗?
  • 所以我添加了 df.head() 但现在我得到以下顺序 {('C', 'A'): 1.2, ('D', 'B'): 0.7, ( 'A','C'):0.7,('D','C'):0.6,('C','D'):1.0,('A','B'):0.6}。您在答案中使用了哪些小写字母?这些也是列名,不是吗?
  • @ball_jan 你用的是什么版本的python?
  • Python 字典本质上是无序的。此外,如果您有另一个相同列组合的实例,则第二个将取代第一个以替换值
【解决方案2】:

理解将适用于较小的帧:

dict((tuple((a, b)), c) for a,b,c in df.values)
#{('A', 'B'): 0.6,
# ('A', 'C'): 0.7,
# ('C', 'A'): 1.2,
# ('C', 'D'): 1.0,
# ('D', 'B'): 0.7,
# ('D', 'C'): 0.6}

如果订购有问题:

from collections import OrderedDict

d = OrderedDict((tuple((a, b)), c) for a,b,c in df.values)
#OrderedDict([(('A', 'B'), 0.6),
#             (('A', 'C'), 0.7),
#             (('C', 'D'), 1.0),
#             (('C', 'A'), 1.2),
#             (('D', 'B'), 0.7),
#             (('D', 'C'), 0.6)])

【讨论】:

    【解决方案3】:

    如果你会使用简单的代码:

    这个不会使用任何像熊猫这样的导入:

    def change_csv(filename):
        file_pointer = open(filename, 'r')
        data = file_pointer.readlines()
        dict = {}
        file_pointer.close()
        for each_line in data:
            a, b, c =  each_line.strip().split(" ")
            dict[a, b] = c
        return dict
    

    所以你的。

    输出是:

    {('A', 'B'): '0.6', ('A', 'C'): '0.7', ('C', 'D'): '1.0', ('C', 'A'): '1.2', ('D', 'B'): '0.7', ('D', 'C'): '0.6'}
    

    【讨论】:

      【解决方案4】:

      这不如@Vaishali 的回答简洁,但让您对这些步骤有更多的了解。

      vals1 = df['A'].values
      vals2 = df['B'].values
      vals3 = df['C'].values
      
      dd = {}
      for i in range(len(vals1)):
          key = (vals1[i], vals2[i])
          value = vals3[i]
          dd[key] = value
      
      {('A', 'B'): '0.6',
      ('A', 'C'): '0.7',
      ('C', 'D'): '1.0',
      ('C', 'A'): '1.2',
      ('D', 'B'): '0.7',
      ('D', 'C'): '0.6'}
      

      【讨论】:

        【解决方案5】:

        Jan - 这里有一个想法:只需使用 pandas 应用函数创建一个键列来生成前 2 列的元组,然后将它们压缩到一个字典中。

        import pandas as pd
        df = pd.read_clipboard()
        df.columns = ['first', 'second', 'value']
        df.head()
        
        def create_key(row):
            return (row['first'], row['second'])
        
        df['key'] = df.apply(create_key, axis=1)
        
        dict(zip(df['key'], df['value']))
        
        {('A', 'C'): 0.7,
         ('C', 'A'): 1.2,
         ('C', 'D'): 1.0,
         ('D', 'B'): 0.7,
         ('D', 'C'): 0.6}
        

        【讨论】:

          猜你喜欢
          • 2011-09-29
          • 1970-01-01
          • 1970-01-01
          • 2020-05-09
          • 2010-10-15
          • 2019-04-17
          • 1970-01-01
          相关资源
          最近更新 更多