【问题标题】:How to implement Selection Sort within a list?如何在列表中实现选择排序?
【发布时间】:2016-08-31 13:03:56
【问题描述】:

所以我有一个.txt 文件如下:

131,263.07
47,170.14
170,190.01
180,412.69
53,401.53

我必须读取文件才能输出如下列表:

131 kms, $263.07
47 kms, $170.14
170 kms, $190.01
180 kms, $412.69
53 kms, $401.53

我使用的代码是:

def PrintList(table):
    for line in table:
       print(str(line[0]) + " kms, $" + str(line[1]))

file = open(input("Enter file name: ")) 

table = []
for line in file:
    line = line.rstrip().split(",")
    line[0] = int(line[0])
    line[1] = float(line[1])
    table.append(line)

PrintList(table)

file.close()

现在我想按价格升序对列表进行排序以获得:

47 kms, $170.14
170 kms, $190.01
131 kms, $263.07
53 kms, $401.53
180 kms, $412.69

我将如何在 Python 中实现它?我尝试使用Selection Sort 执行此操作,但它似乎不起作用。

更新:感谢您迄今为止的意见。不过,我已经尝试过排序功能,但我想弄清楚如何使用Selection Sort 来实现它。

更新:我无法发布我使用过的Selection Sort 代码,因为我已经覆盖了它,但下面给出的是代码示例(我用它来随机排序距离列表),我必须修改它以按价格升序对上述列表进行排序。希望够了。

def selectionSort(distance):
    n = len(distance)
    for i in range(n):
        minPlace = searchMin(distance)
        swap(distance, i, minPlace+i)

def searchMin(distance):
    minPlace = 0
    n = len(distance)
    for i in range(1, n):
        if distance[i] < distance[minPlace]:
            minPlace = i
        return minPlace

def swap(distance, i, j):
    temp = distance[i]
    distance[i] = distance[j]
    distance[j] = temp

如果有更简单的实现方法,请告诉我。提前致谢。干杯。

【问题讨论】:

  • 你用过排序功能吗?
  • 是的,我有。但是,我想弄清楚如何使用选择排序来实现它。
  • 你得到的所有答案都是关于“这里是如何让 python 为你排序”但是你需要帮助你的排序算法不起作用吗?
  • 你能展示你目前的代码吗?什么不工作。
  • ^ 您尝试的选择排序的代码。

标签: python python-3.x selection-sort


【解决方案1】:

Python 列表已经带有 sort 方法。您可以简单地调用它,指定一个key 参数来确定如何排序。

def print_list(table):
    for line in table:
       print(str(line[0]) + " kms, $" + str(line[1]))

with open(input("Enter file name: ")) as f:
    table = []
    for line in f:
        line = line.rstrip().split(",")
        line[0] = int(line[0])
        line[1] = float(line[1])
        table.append(line)

    table.sort(key=lambda line: line[1])
    print_list(table)

请注意,我对您的程序进行了一些额外的更改,即根据 PEP8 重命名 PrintList,并使用 with statement 以便文件自动关闭。

如果坚持使用Selection Sort(会比Python默认的排序差),在实现sorted接口的helper函数中实现。

【讨论】:

  • 您可能需要链接到 PEP 8 的 specific section 以了解函数命名约定。
  • @TadhgMcDonald-Jensen 感谢您的提示!已编辑。将来,如果您要澄清链接,请随时编辑我的帖子。祝你有美好的一天!
【解决方案2】:

是否绝对有必要实现选择排序?我会选择sorted

PrintList(sorted(table, key = lambda x: x[1]))

在哪里

key = lambda x: x[1]

指示sorted 使用索引为1(价格)的元素的值来比较您的对象。

【讨论】:

  • 是的,我想看看它是如何与选择排序一起工作的。
【解决方案3】:

在你的 for 循环之后:

sorted_table = sorted(table, key=lambda row: row[1], reverse=True)

Sorted_table 现在包含您的表格数据,按第二列排序。 然后,您可以将 sorted_table 传递给您的 PrintList 函数。避免 lambda 的替代方法:

from operator import itemgetter
sorted_table = sorted(table, key=itemgetter(1), reverse=True)

有关 python 排序的更多信息,请参阅:https://wiki.python.org/moin/HowTo/Sorting

【讨论】:

  • 我认为添加reverse=True 会按降序对列表进行排序。
  • 您可以使用list.sort() 就地排序,而不是创建新列表。
【解决方案4】:

蛮力选择排序

lst = [56,2,5,3,6,4,7,1,8,10,34]
print(lst)

#Total length of the list
leng=len(lst)

#Loop from 1st to last of the list
for i in range(leng):
    #Assume first value as minimum 
    min = lst[i]
    print(min,'Minimum value before the for loop')
    #Scan through every value for checking the minimum 
    for j in range(i,leng):
        if lst[j] < min:          
            min=lst[j]
            ts=j
            print(min,"Minimum value", ts, "Is it's corresponding index")
    #We have now the new minimum value and it's corresponding index.
    #Swap the new minimum value and the corresponding index            
    if min <lst[i]:
         temp =lst[i]
         lst[i]=lst[ts]   
         lst[ts]=temp
    print(lst,'Outer list')

【讨论】:

  • 您已将您的示例标记为“蛮力选择排序” SudheeM。您做出如此区分的事实表明还有其他选择。即使您没有指出为什么区分很重要,如果您修改您的答案并附上一个简短的说明,说明您为什么采用这种特殊方法而不是其他一些非蛮力 替代。 TIA。
猜你喜欢
  • 2019-02-21
  • 1970-01-01
  • 2022-07-06
  • 1970-01-01
  • 2016-05-28
  • 2013-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多