【问题标题】:Creating dictionary from list with different orders从具有不同顺序的列表创建字典
【发布时间】:2021-07-03 09:35:06
【问题描述】:

假设我有一个如下所示的列表:

[[('name', 'n1')], [('value', 'v1')], [('name', 'n2')], [('value', 'v2')], [('name', 'n3')], [('value', 'v3')]]

我能够运行res = dict((str(x[0][1]), y[0][1]) for x, y in zip(new[::2], new[1::2])),其中res 等于 {'n1':'v1', 'n2':'v2', 'n3':'v3'},这正是我在这种情况下想要的。当名称和值交替出现时就是这种情况。

不过,我也有一些类似这样的列表:

[[('name', 'n1')], [('name', 'n2')], [('name', 'n3')], [('value', 'v1')], [('value', 'v2')], [('value', 'v3')]]

在这里,我有名称、名称、名称,然后是相应的值、值、值。在这种情况下,我希望得到与上面相同的 res 字典,但我的代码在这种情况下无法正常工作。

有没有一种方法可以涵盖这两种情况来创建一个将名称映射到相应值的字典? (仅供参考:每次可能不会有三个,可能更多/更少)。

【问题讨论】:

    标签: python list dictionary tuples


    【解决方案1】:

    这是一种可能的单行解决方案(lst 是您的输入列表):

    res = dict(zip([el[0][1] for el in lst if el[0][0] == 'name'],
                   [el[0][1] for el in lst if el[0][0] == 'value']))
    

    【讨论】:

      【解决方案2】:

      试试这个,很简单,但是当你有奇数时它就不起作用了。

      values = [y[1] for x in input_list for y in x]
      res = {values[i]: values[i + 1] for i in range(0, len(values), 2)}
              
      

      【讨论】:

        【解决方案3】:

        您可以使用更易读的语法分两步编写代码,唯一的条件是名称的第一次出现与值的第一次出现匹配,第二次,第三次等相同.. 这可以是这样的:

        a = <one of the 2 sets of data>
        a1 = filter(lambda x: x[0][0]=='name',a) # filter the keys
        a2 = filter(lambda x: x[0][0]=='value',a) # filter the values
        res = {k[0][1]:v[0][1] for (k,v) in zip (a1,a2)} # mix them into a dict
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-01-11
          • 1970-01-01
          • 2018-09-15
          • 1970-01-01
          • 2019-10-20
          • 2018-10-20
          • 1970-01-01
          • 2019-03-12
          相关资源
          最近更新 更多