如何重命名列表中的项目?
如何重命名列表中的项目?
我有一个类似这样的列表列表:
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中,最好的方法是什么?
问题的出现原因:
在给定的列表中,每个子列表的第一个元素是可能的元素列表。要求将子列表中的元素替换为其在可能元素列表中的索引值(从1开始)。最后,需要将替换后的列表恢复为原始列表。
解决方法:
创建一个空字典lookup_dict和reverse_dict来存储索引和元素的对应关系。
遍历给定列表MyList中的每个子列表ele,将索引和列表的第一个元素ele[0]分别存储在lookup_dict和reverse_dict中。
通过列表推导式,将给定列表中的元素替换为其在可能元素列表中的索引值加1,存储在result列表中。
通过列表推导式,将替换后的列表result恢复为原始列表,存储在re_list中。
最后,判断re_list是否等于原始列表MyList,如果相等则输出True。
代码如下:
lookup_dict = {} reverse_dict = {} index = 0 for ele in MyList: lookup_dict[index] = ele[0] reverse_dict[repr(ele[0])] = index index += 1 result = [[reverse_dict[repr(subele)] + 1 for subele in ele] for ele in MyList] re_list = [[lookup_dict[subele - 1] for subele in ele] for ele in result] print(re_list == MyList) # 输出True
如果可以使用零索引,可以将代码中的+/- 1去掉,以减少复杂性。
如何重命名列表中的列表项?
有时候我们需要对列表中的列表项进行重命名,可以使用以下函数:
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 # 或者任何默认值
然后使用双重循环 `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]
以上是解决此问题的方法。
问题的出现原因:这段代码中的问题是需要将一个包含列表的列表中的元素替换为字典中对应的值,但由于列表是可变的,因此不能直接将列表作为字典的键。
解决方法:首先,创建一个新的空列表newList。然后,使用一个计数器变量counter来追踪新列表中的位置。接下来,使用两个嵌套的循环遍历原始列表中的每个元素。在内部循环中,将元素转换为一个元组,作为字典的键来获取对应的值,并将该值添加到新列表中的相应位置。最后,增加计数器的值,以便在新列表中正确追踪位置。
整理后的文章:
这段代码中的问题是需要将一个包含列表的列表中的元素替换为字典中对应的值,但由于列表是可变的,因此不能直接将列表作为字典的键。
为了解决这个问题,首先创建一个新的空列表newList。然后,使用一个计数器变量counter来追踪新列表中的位置。接下来,使用两个嵌套的循环遍历原始列表中的每个元素。在内部循环中,将元素转换为一个元组,作为字典的键来获取对应的值,并将该值添加到新列表中的相应位置。最后,增加计数器的值,以便在新列表中正确追踪位置。
下面是代码实现:
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
尽管这个解决方法可行,但肯定还有改进的空间。