所以,我有两个包含以下内容的列表:
[10, 10, 2, 9, 10]
['Jem', 'Sam', 'Sam', 'Jem', 'Jem']
我想使用.sort()函数对第二个列表进行排序,我希望对第二个列表所做的更改会影响第一个列表,即
['Jem', 'Jem', 'Jem', 'Sam', 'Sam']
[10, 9, 10, 10, 2]
如果不清楚,那么将其视为两个列表被链接。两个列表([0],[1]等)中每个点的字符串/整数连接在一起,因此每个列表元素位置的变化都会通过相同的位置变化来反映。另一个列表中的对应元素。我怎么做到这一点?
答案 0 :(得分:1)
将两个列表实际链接到元组列表中可能有意义:
list_1 = [10, 10, 2, 9, 10]
list_2 = ['Jem', 'Sam', 'Sam', 'Jem', 'Jem']
merged_list = zip(list_1, list_2)
print sorted(merged_list, key=lambda x: x[1])
这打印出以下内容:
[(10, 'Jem'), (9, 'Jem'), (10, 'Jem'), (10, 'Sam'), (2, 'Sam')]
如果需要,您可以将这些列表(分成两个单独的元组)取消合并,否则您可以对元组列表进行操作
unlinked = zip(*sorted_merged)
print unlinked
输出:
[(10, 9, 10, 10, 2), ('Jem', 'Jem', 'Jem', 'Sam', 'Sam')]
答案 1 :(得分:1)
如果列表确实相关/相关,我会zip
他们。
>>> l1 = [10, 10, 2, 9, 10]
>>> l2 = ['Jem', 'Sam', 'Sam', 'Jem', 'Jem']
>>> pairs = list(zip(l1,l2))
>>> pairs
[(10, 'Jem'), (10, 'Sam'), (2, 'Sam'), (9, 'Jem'), (10, 'Jem')]
然后,您可以使用key
或sort
sorted
参数按名称或值对其进行排序
>>> sorted(pairs, key = lambda i : i[1])
[(10, 'Jem'), (9, 'Jem'), (10, 'Jem'), (10, 'Sam'), (2, 'Sam')]
答案 2 :(得分:1)
这是一种方法:
In [18]: l1 = [10, 10, 2, 9, 10]
In [19]: l2 = ['Jem', 'Sam', 'Sam', 'Jem', 'Jem']
In [20]: l2, _, l1 = map(list, zip(*sorted(zip(l2, range(len(l1)), l1))))
In [21]: l1
Out[21]: [10, 9, 10, 10, 2]
In [22]: l2
Out[22]: ['Jem', 'Jem', 'Jem', 'Sam', 'Sam']
从内到外:
zip(l2, range(len(l1)), l1)
生成一个元组列表,如下所示:
[('Jem', 0, 10), ('Jem', 1, 9), ('Jem', 2, 10), ('Sam', 3, 10), ('Sam', 4, 2)]
这里,第一个元素是来自l2
的项目,第二个元素只是一个从零开始的计数器,第三个元素是来自l1
的项目。
sorted(...)
首先按l2
对元组进行排序,然后按原始列表中的位置进行排序(我从您的示例中猜测这是您想要的;如果您想要的话,代码可以简化你没有这样的要求。)
zip(*...)
将已排序的列表拆分为三个元组的列表。
map(list, ...)
将元组转换为列表。
l2, _, l1
将第一个和第三个列表分配给l2
和l1
,并丢弃第二个列表。
答案 3 :(得分:1)
关于你被介绍给Python zip的时间!
然后你可以像这样使用它:
def sorted_together(*args, **kwargs):
reverse = False
key = None
if 'reverse' in kwargs:
reverse = kwargs['reverse']
if 'key' in kwargs:
key = kwargs['key']
zipped = zip(*args)
zipped.sort(reverse=reverse, key=key)
tups = zip(*zipped)
lists = [list(x) for x in tups] #
return lists
请记住,zip()会返回一个元组列表,所以如果你想在最后找到列表,那么最后一个列表理解是非常必要的。
答案 4 :(得分:0)
只需zip
他们在一起并按名称排序:
name = ['Jem', 'Sam', 'Sam', 'Jem', 'Jem']
nums = [10, 10, 2, 9, 10]
sort = sorted(zip(name, nums), key = lambda i:i[0])
name = [i[0] for i in sort] # split name again
nums = [i[1] for i in sort] # split nums again