【问题标题】:Sort a list alphabetically and retrieve initial index in python按字母顺序对列表进行排序并在 python 中检索初始索引
【发布时间】:2020-04-30 04:32:56
【问题描述】:

我一直在尝试按字母顺序对姓名列表进行排序,比如说:

list=['Bob','Alice','Charlie']
print(list.index('Alice'))
1

但是我也想跟踪原始索引,所以这不起作用:

list.sort()
print(list)
['Alice','Bob','Charlie']
print(list.index('Alice'))
0

排序后索引发生变化;有没有办法跟踪原始索引?我检查了其他类似的问题,numpy 有一个解决方案,但对 str 变量没有用。

【问题讨论】:

  • 您可以创建原始列表的副本并用于引用原始索引。
  • 你的名单是独一无二的吗?
  • 有点取决于为什么你想要那个以及你打算用这些信息做什么。
  • 我该怎么做?我试图复制一份,比如 templist=list,但修改 list 中的元素也会更改 templist 中的元素。
  • ON '为什么',我正在尝试制作成员列表,每个成员都有一个唯一的 ID 号......我希望该号码与列表索引相关联跨度>

标签: python sorting indexing alphabetical-sort


【解决方案1】:

只需对 enumerate 中的反向 (index, name) 元组进行排序即可跟踪元素及其索引:

>>> names = ['Bob','Alice','Charlie']
>>> sorted((name, index) for index, name in enumerate(names))
[('Alice', 1), ('Bob', 0), ('Charlie', 2)]

【讨论】:

    【解决方案2】:
    l = ['Bob','Alice','Charlie']
    e = enumerate(l) # creates a generator of [(0, 'Bob'), (1, 'Alice'), (2, 'Charlie')]
    sl = sorted(e, key=lambda x: x[1]) # [(1, 'Alice'), (0, 'Bob'), (2, 'Charlie')]
    

    【讨论】:

      【解决方案3】:

      您可以创建另一个索引列表并对其进行排序,而原始索引保持不变:

      >>> a = ['Bob', 'Alice', 'Charlie']
      >>> idx = range(len(a))
      >>> idx
      [0, 1, 2]
      >>> sorted( idx, key=lambda x : a[x] )
      [1, 0, 2]
      >>> 
      

      【讨论】:

      • range() 返回一个列表?
      • @PalakKumarJha 是的,除非你使用 python 3 或其他东西
      【解决方案4】:

      您可以创建一个嵌套的排序字典来保存原始索引和排序值。

      首先我建议为你的列表对象使用一个合适的名称,list 是 python 中的一个关键字。

      names=['Bob','Alice','Charlie']
      
      name_dict = {name : {'unsorted' : idx} for idx,name in enumerate(names)}
      
      for sorted_idx, name in enumerate(sorted(names)):
          name_dict[name].update({'sorted' : sorted_idx})
      

      print(name_dict['Bob']['sorted'])
      1
      print(name_dict['Bob']['unsorted'])
      0
      
      print(name_dict)
      
      {'Bob': {'unsorted': 0, 'sorted': 1},
       'Alice': {'unsorted': 1, 'sorted': 0},
       'Charlie': {'unsorted': 2, 'sorted': 2}}
      

      【讨论】:

      • 我认为这很好地展示了排序前后发生的情况。
      • 谢谢,现在我想起来了,你的回答更简洁 @RoadRunner 很酷,看到另一个 Microsoft Azure 坚果 :)
      【解决方案5】:

      按字母顺序排序列表并在python中检索初始索引元素

      l=['Bob','Alice','Charlie']
      def sort_and_get_first_element(list1):
          list1.sort()
          return list1[0]
      print sort_and_get_first_element(l)
      

      【讨论】:

      • 我不会因为这个而投反对票,但这根本不能回答所提出的问题。您只是返回排序列表中的第一项。
      【解决方案6】:

      是的,您可以跟踪初始索引,但使用不同的数据结构

      a = ['Bob','Alice','Charlie']
      l = sorted(enumerate(a), key=lambda i: i[1])
      print(l)
      

      现在跟踪初始索引的排序列表是,

      [(1, 'Alice'), (0, 'Bob'), (2, 'Charlie')]
      

      【讨论】:

        猜你喜欢
        • 2019-09-25
        • 1970-01-01
        • 1970-01-01
        • 2018-07-25
        • 1970-01-01
        • 1970-01-01
        • 2013-08-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多