如何对一个列表进行更改会影响另一个列表?

时间:2015-02-16 20:43:05

标签: python list

所以,我有两个包含以下内容的列表:

[10, 10, 2, 9, 10]
['Jem', 'Sam', 'Sam', 'Jem', 'Jem']

我想使用.sort()函数对第二个列表进行排序,我希望对第二个列表所做的更改会影响第一个列表,即

['Jem', 'Jem', 'Jem', 'Sam', 'Sam']
[10, 9, 10, 10, 2]

如果不清楚,那么将其视为两个列表被链接。两个列表([0],[1]等)中每个点的字符串/整数连接在一起,因此每个列表元素位置的变化都会通过相同的位置变化来反映。另一个列表中的对应元素。我怎么做到这一点?

5 个答案:

答案 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')]

然后,您可以使用keysort

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将第一个和第三个列表分配给l2l1,并丢弃第二个列表。

答案 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