如何重命名列表列表中的项目?

时间:2018-06-06 19:28:50

标签: python list rename

我有一个像这样的列表列表:

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中执行此操作的最佳方法是什么?

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

您可以使用以下功能:

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]

答案 2 :(得分:0)

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

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 :(得分:0)

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]]