按照参考列表的方式对应地排序或删除相应列表中的元素。

3
我在 Python 中有两个长度相同的列表:
listA = [7,6,3,2,1,4,5]

listB = [a,b,c,d,e,f,g]

有没有一种方法(可能是简单的函数),可以对listA进行排序,并以相同的方式更改listB的值。意思是:
listA_new = [1,2,3,4,5,6,7]

并且

listB_new = [e,d,c,f,g,b,a]

有关去重复的问题。例如,如果我有一些列表

listC = [1,1,4,4,5,6,7] 

并且

listD = [a,b,c,d,e,f,g]

翻译的结果应该是:

listC_new = [1,4,5,6,7]

并且

listD_New = [a,c,e,f,g]

你目前尝试了什么? - codester_09
1
存储多个相关列表感觉不是正确的方法。相反,考虑存储一个2元组列表,例如[(7, 'a'), (6, 'b'), (3, 'c'), ...],甚至是4元组:[(7, 'a', 1, 'a'), (6, 'b', 1, 'b'), ...]。您可以使用zip(...)方便地创建这样的列表。 - J_H
4个回答

4

试试这个:

[i for j, i in sorted(zip(listA, listB))]

输出:

listA = [7, 6, 3, 2, 1, 4, 5]
listB = ["a", "b", "c", "d", "e", "f", "g"]

In [5]: [i for j, i in sorted(zip(listA, listB))]
Out[5]: ['e', 'd', 'c', 'f', 'g', 'b', 'a']

为支持C和D(去重),需要进行以下操作:

sorted(list({j: i for j, i in reversed(sorted(zip(listC, listD)))}.values()))

.values() 返回一个列表D:['a','c','e','f','g'].keys() 返回一个列表C:[1,4,5,6,7]


最后一部分似乎不对。在最后一步使用 sorted,你只会得到排序过的字母,而不是按照相应数字排序的字母。在这个例子中是一样的,但并非普遍情况。 - tobias_k
@tobias_k 仔细看,内部的 sort-reverse 是用来找到第一个匹配的字母。外部的是用来再次反转结果。一般情况下它会起作用。 - Mehrdad Pedramfar
不好意思,它不行。请尝试使用“listA”和“listB”。那里没有重复项,但对于这些列表仍应该有效,但它只返回“listB”中按顺序排序的字母。您应该反转字典值而不是外部“sorted”。 - tobias_k

1
关于“去除重复项”的部分:你可以像其他答案一样开始,但也可以将压缩和排序后的列表通过一个dict管道传输。在Python 3中,dict将尊重插入顺序,但它会保留每个键的最后一个,因此当排序时需要翻转列表,然后在dict阶段再翻转回来。
>>> listC = [1,1,4,4,5,6,7] 
>>> listD = ["a","b","c","d","e","f","g"]
>>> list(reversed(dict(sorted(zip(listC, listD), reverse=True)).items()))
[(1, 'a'), (4, 'c'), (5, 'e'), (6, 'f'), (7, 'g')]
>>> listC_new, listB_new = zip(*_)
>>> listC_new
(1, 4, 5, 6, 7)
>>> listB_new
('a', 'c', 'e', 'f', 'g')

1

针对您的第一部分。

listA = [7,6,3,2,1,4,5]


listB = ['a','b','c','d','e','f','g']
dict_ = {key:value for key,value in zip(listB,listA)}

listA_new = sorted(listA)
listB_new = sorted(listB,key=lambda e:dict_[e])
print(listA_new)
print(listB_new)
输出
[1, 2, 3, 4, 5, 6, 7]
['e', 'd', 'c', 'f', 'g', 'b', 'a']

为了避免重复项,请尝试以下方法。
listC = [1,1,4,4,5,6,7]


listD = ['a','b','c','d','e','f','g']


listC_out = []
listD_out = []
for a,b in zip(listC,listD):
    if a not in listC_out:
        listD_out.append(b)
        listC_out.append(a)

print(listC_out)
print(listD_out)
输出
[1, 4, 5, 6, 7]
['a', 'c', 'e', 'f', 'g']

1

输出不正确。 - codester_09
1
@SharimIqbal 你是什么意思?不管怎样,现在已经有一个答案被接受了...至少这让我获得了一些声望哈哈 - Silloky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接