【问题标题】:How to add an index to a list of a list in Python如何将索引添加到 Python 中的列表列表
【发布时间】:2018-05-02 10:58:59
【问题描述】:

我想在我当前拥有的列表中对列表进行排序,这不是问题,我相信我已将值保存为数组中的单个索引,但需要 finishTime 作为单独的索引需要按此值对数组进行排序。此代码的上下文是一个简单的运动员比赛数据输入表单。 代码如下

import time
datasets= []


for i in range(1, 3):
    print("Inputting Data for Lane", i)
    gender = input("Is the athlete male or female ")
    athlete = input("What is the athletes name ")
    finishTime = input("What was the finishing time ")
    dataset = ("Gender =", gender, "|" ,"Athlete =", athlete, "|","Finish time", finishTime)
    datasets.append(dataset)






for s in datasets:
    time.sleep(1)
    print("")
    print(*s)

应该是这样的

>Male John, 9
>Female Sarah, 7

如您所见,它们应该是两个不同的索引,以便我可以按末尾的数字对列表中的列表进行排序。

【问题讨论】:

  • 你可以使用sorted
  • 为什么不对数据集使用字典或命名元组,并为数据集使用这些列表?
  • 它需要按finishTime排序但是,我认为每个数组只有一个索引。它需要另一个索引,它是可以对其进行排序的 FinishTime,我在执行此操作时遇到了麻烦。

标签: python arrays python-3.x sorting for-loop


【解决方案1】:

首先使用正确的数据结构——这个:

("Gender =", gender, "|" ,"Athlete =", athlete, "|","Finish time", finishTime)

正在将数据(genderathletefinishTime 值)与演示内容混合在一起,几乎无法使用。要么只存储值,即:

 datasets.append((gender, athlete, finishTime))

您知道datasets 中的每一“行”,row[0] 是性别,row[1] 是名称,row[2] 是时间。

row = datasets[0]
print("Gender : {}".format(row[0]))

如果您想要更明确的内容,请使用 dicts:

 datasets.append(
     {"gender": gender, "athlete": athlete, "finishTime": finishTime}
     )

所以对于每一行,您可以通过键而不是索引来获取值:

row = datasets[0]
print("Gender : {}".format(row["gender"]))

那么你肯定想让finsihTime 成为一个整数——input() 返回一个字符串,而字符串的排序方式与整数不同:

>>> lst = ["15", "2", "21", "3"]
>>> sorted(lst)
['15', '2', '21', '3']

>>> lst2 = [15, 2, 31, 3]
>>> sorted(lst2)
[2, 3, 15, 31]

那么您只需将正确的key 回调函数传递给sorted()。如果你使用元组:

>>> datasets
[('male', 'foo', 15), ('female', 'bar', 11)]

>>> sorted(datasets, key=lambda row: row[2])
[('female', 'bar', 11), ('male', 'foo', 15)]

如果你使用字典:

>>> datasets
[{'gender': 'male', 'athlete': 'foo', 'finishTime': 15}, {'gender': 'female', 'athlete': 'bar', 'finishTime': 11}]
>>> sorted(dataset, key=lambda row: row["finishTime"])
[{'gender': 'female', 'athlete': 'bar', 'finishTime': 11}, {'gender': 'male', 'athlete': 'foo', 'finishTime': 15}]

【讨论】:

    【解决方案2】:

    使用您的列表列表,使用sort() 对列表进行就地排序,或使用sorted() 获取新的排序列表。使用任一函数的key 参数对列表的最后一个元素进行排序。如果您需要从最大完成时间到最短排序的项目,请设置reverse=True

    datasets.sort(key=lambda dataset: float(dataset[-1]), reverse=True)
    

    这将根据每个嵌套列表的最后一项的数字浮点值对列表进行排序。您可能更喜欢使用 Decimals 而不是 floats 以避免任何精度损失,特别是如果您需要执行时间计算。

    但是,我认为最好使用字典、命名元组,甚至是普通的元组,而不是内部列表。下面是一个使用字典的例子:

    datasets = []
    
    for i in range(1, 3):
        dataset = {}
        print("Inputing Data for Lane", i)
        dataset['lane'] = i
        dataset['gender'] = input("Is the athlete male or female ")
        dataset['athlete'] = input("What is the athletes name ")
        dataset['finishTime'] = float(input("What was the finishing time "))
        datasets.append(dataset)
    
    datasets.sort(key=lambda d: d['finishTime'], reverse=True)
    
    for dataset in datasets:
        print('{} {}, {}'.format(dataset['gender'], dataset['athlete'], dataset['finishTime']))
    

    【讨论】:

      【解决方案3】:
      import time
      datasets= []
      
      
      for i in range(0, 3):
          print("Inputting Data for Lane", i)
          gender = str(input("Is the athlete male or female ")) # female|male check missing...
          athlete = str(input("What is the athletes name "))
          finishTime = str(input("What was the finishing time "))
          dataset = [gender, athlete, finishTime]
          datasets.append(dataset)
      
      
      
      
      
      print("{0:<10}{1:<10}{2:<15}".format("Gender","Athlete","Finish time"))
      
      ds = sorted(datasets, key=lambda x:x[2], reverse=False)
      
      for s in ds:
          time.sleep(1)
          print("{0:<10}{1:<10}{2:<15}".format(s[0], s[1], s[2]))
      

      【讨论】:

      • 您能否简要解释一下您添加的内容,以便我进一步理解。
      • 已更改为列表格式,因为 sorted() 函数仅适用于它。所有输入都作为字符串添加到数据集(因此按数据集 [2] / 完成时间排序)是根据字符串类型,而不是时间或 int。所以前导零对于完成时间很重要(“01:00”与“1:00”不同)。将输出更改为格式化字符串以获得表格输出。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-23
      • 1970-01-01
      • 2018-03-06
      • 1970-01-01
      • 1970-01-01
      • 2020-09-10
      • 1970-01-01
      相关资源
      最近更新 更多