我有一个像这样的列表列表:
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中执行此操作的最佳方法是什么?
答案 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]]