Python 对一个列表所做的更改如何影响另一个不同的列表?

Python 对一个列表所做的更改如何影响另一个不同的列表?,python,list,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]等)中每个点处的字符串/整数连接在一起,因此一个列表中某个元素位置的每次

因此,我有两个列表,其中包含:

[10, 10, 2, 9, 10]
['Jem', 'Sam', 'Sam', 'Jem', 'Jem']
我希望使用.sort()函数对第二个列表进行排序,并希望对第二个列表所做的更改影响第一个列表,即

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

如果这还不清楚,那就把它想象成两个列表被链接起来。两个列表([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')]

实际上,将两个列表链接到一个元组列表可能是有意义的:

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

如果这些列表确实是相关的,我会
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')]
然后,您可以使用
排序
排序
参数按名称或值对它们进行排序

>>> sorted(pairs, key = lambda i : i[1])
[(10, 'Jem'), (9, 'Jem'), (10, 'Jem'), (10, 'Sam'), (2, 'Sam')]

如果这些列表确实是相关的,我会
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')]
然后,您可以使用
排序
排序
参数按名称或值对它们进行排序

>>> sorted(pairs, key = lambda i : i[1])
[(10, 'Jem'), (9, 'Jem'), (10, 'Jem'), (10, 'Sam'), (2, 'Sam')]

以下是一种方法:

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、\u1、l1
    将第一个和第三个列表分配给
    l2
    l1
    ,并丢弃第二个列表


    • 这里有一种方法:

      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、\u1、l1
        将第一个和第三个列表分配给
        l2
        l1
        ,并丢弃第二个列表


      该是向您介绍Python的时候了

      然后你可以这样使用它:

      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()返回一个元组列表,因此,如果您希望在最后返回列表,那么最后一次列表理解是非常必要的。

      是时候向您介绍Python了

      然后你可以这样使用它:

      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()返回一个元组列表,因此,如果您希望在最后返回列表,则必须理解最后一个列表。

      只需
      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
      

      只需
      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
      

      制作一个元组列表并对其进行排序怎么样?我现在正在测试它…看起来像一个魔咒。非常感谢!制作一个元组列表并对其进行排序怎么样?我现在正在测试它…看起来像一个魔咒。非常感谢!