【问题标题】:How to rename items in a list of lists? [duplicate]如何重命名列表列表中的项目? [复制]
【发布时间】:2018-11-16 14:19:28
【问题描述】:

我有一个这样的列表:

MyList = [[[[11, 12], [13, 14]], [[12, 13], [22, 23]], [[24, 34], [53, 54]], [[43, 44], [54, 55]]],
          [[[12, 13], [22, 23]], [[11, 12], [13, 14]], [[15, 25], [44, 54]], [[24, 34], [53, 54]]],
          [[[13, 14], [21, 31]], [[15, 25], [44, 54]], [[52, 53], [54, 55]]],
          [[[15, 25], [44, 54]], [[12, 13], [22, 23]], [[13, 14], [21, 31]]],
          [[[24, 34], [53, 54]], [[11, 12], [13, 14]], [[12, 13], [22, 23]]],
          [[[34, 35], [45, 55]], [[52, 53], [54, 55]]],
          [[[43, 44], [54, 55]], [[11, 12], [13, 14]]],
          [[[52, 53], [54, 55]], [[13, 14], [21, 31]], [[34, 35], [45, 55]]]]

在这个列表列表中,我有 8 个项目。我想像这样重命名这些项目:

[[11, 12], [13, 14]] = 1
[[12, 13], [22, 23]] = 2
[[13, 14], [21, 31]] = 3
[[15, 25], [44, 54]] = 4
[[24, 34], [53, 54]] = 5
[[34, 35], [45, 55]] = 6
[[43, 44], [54, 55]] = 7
[[52, 53], [54, 55]] = 8

最后,重命名的列表将如下所示:

MyListRename = [[1, 2, 5, 7],
                [2, 1, 4, 5],
                [3, 4, 8],
                [4, 2, 3],
                [5, 1, 2],
                [6, 8],
                [7, 1],
                [8, 3, 6]]

在 python 中最好的方法是什么?

【问题讨论】:

  • 列表中的项目(无论类型如何)没有名称。通常,单个元素使用带有[] 括号的整数索引来引用。

标签: python list rename


【解决方案1】:

代码

MyList = [
      [[[11, 12], [13, 14]], [[12, 13], [22, 23]], [[24, 34], [53, 54]], [[43, 44], [54, 55]]],
      [[[12, 13], [22, 23]], [[11, 12], [13, 14]], [[15, 25], [44, 54]], [[24, 34], [53, 54]]],
      [[[13, 14], [21, 31]], [[15, 25], [44, 54]], [[52, 53], [54, 55]]],
      [[[15, 25], [44, 54]], [[12, 13], [22, 23]], [[13, 14], [21, 31]]],
      [[[24, 34], [53, 54]], [[11, 12], [13, 14]], [[12, 13], [22, 23]]],
      [[[34, 35], [45, 55]], [[52, 53], [54, 55]]],
      [[[43, 44], [54, 55]], [[11, 12], [13, 14]]],
      [[[52, 53], [54, 55]], [[13, 14], [21, 31]], [[34, 35], [45, 55]]]
      ]

OtherList = [
    [[11, 12], [13, 14]],
    [[12, 13], [22, 23]],
    [[13, 14], [21, 31]],
    [[15, 25], [44, 54]],
    [[24, 34], [53, 54]],
    [[34, 35], [45, 55]],
    [[43, 44], [54, 55]],
    [[52, 53], [54, 55]]
    ]

NewList = [[OtherList.index(j) + 1 for j in i] for i in MyList]

print(NewList)

输出

[[1, 2, 5, 7],
 [2, 1, 4, 5],
 [3, 4, 8],
 [4, 2, 3],
 [5, 1, 2],
 [6, 8],
 [7, 1],
 [8, 3, 6]]

【讨论】:

    【解决方案2】:

    我会以编程方式执行此操作,利用每个列表的第一个元素是可能元素的列表这一事实:

    lookup_dict = {}
    reverse_dict = {}
    index = 0
    for ele in MyList:
        lookup_dict[index] = ele[0]
        reverse_dict[repr(ele[0])] = index
        index += 1
    

    注意:列表通常不能用作字典键。在这种情况下,我们使用repr(...) 来获取字符串形式的表示以用作键

    然后让我们通过以下方式压缩列表:

    result = [[reverse_dict[repr(subele)] + 1 for subele in ele] for ele in MyList]
    
    [[1, 2, 5, 7], 
     [2, 1, 4, 5], 
     [3, 4, 8], 
     [4, 2, 3], 
     [5, 1, 2], 
     [6, 8], 
     [7, 1], 
     [8, 3, 6]]
    

    并通过以下方式重构原始内容:

    re_list = [[lookup_dict[subele - 1] for subele in ele] for ele in result]
    
    >>> re_list == MyList
    True
    

    如果您还可以使用零索引,则可以删除 +/- 1 以稍微降低复杂性。

    【讨论】:

      【解决方案3】:

      你可以使用如下函数:

      def replace_list (sub_list):
          if sub_list == [[11, 12], [13, 14]]: return 1
          if sub_list == [[12, 13], [22, 23]]: return 2
          if sub_list == [[13, 14], [21, 31]]: return 3
          if sub_list == [[15, 25], [44, 54]]: return 4
          if sub_list == [[24, 34], [53, 54]]: return 5
          if sub_list == [[34, 35], [45, 55]]: return 6
          if sub_list == [[43, 44], [54, 55]]: return 7
          if sub_list == [[52, 53], [54, 55]]: return 8
          return 0 #or any default value
      

      然后做一个双循环for来改变MyList中的值:

      for i in range(len(MyList)):
          for j in range(len(MyList[i])):
              MyList[i][j] = replace_list (MyList[i][j])
      

      甚至在列表理解中使用map

      MyList = [map(replace_list, subList) for subList in MyList]
      

      【讨论】:

        【解决方案4】:

        (这个方案肯定可以改进)

        mydict = {
            ((11, 12), (13, 14)): 1,
            ((12, 13), (22, 23)): 2,
            ((13, 14), (21, 31)): 3,
            ((15, 25), (44, 54)): 4,
            ((24, 34), (53, 54)): 5,
            ((34, 35), (45, 55)): 6,
            ((43, 44), (54, 55)): 7,
            ((52, 53), (54, 55)): 8
        }
        
        newList = []
        counter = 0
        
        for outlist in myList:
            newList.append([]);
        
            for inList in outlist:
                obj = (tuple(inList[0]), tuple(inList[1]))
                newList[counter].append(mydict[obj])
        
            counter += 1
        

        我正在使用一个字典,其中的键是表示您要替换的列表的元组。请记住,列表是可变的,因此不可散列。

        【讨论】:

          猜你喜欢
          • 2019-04-27
          • 2021-04-17
          • 2021-12-12
          • 2020-11-21
          • 2020-11-09
          • 2023-03-05
          • 2017-04-29
          • 2015-08-03
          相关资源
          最近更新 更多