【问题标题】:Organizing Sorts组织排序
【发布时间】:2015-11-17 01:53:24
【问题描述】:

我有一个名为 countries.txt 的列表,其中列出了所有国家/地区的名称、面积(以 km2 为单位)、人口(例如 ["Afghanistan",647500.0,25500100])。

def readCountries(filename):

    result=[]
    lines=open(filename)

    for line in lines:
        result.append(line.strip('\n').split(',\t'))
    for sublist in result:
        sublist[1]=float(sublist[1])

我也有两种排序算法:

def countryByArea(area):
    myList=readCountries('countries.txt') 

    for i in range(0,len(myList)): 
        for j in range(0,len(myList)-1): 
            if myList[j][1]>myList[j+1]:
                temp=myList[j]   
                myList[j]=myList[j+1]
                myList[j+1]=temp

    if area < len(myList): 
        return myList[area-1] 
    else:
        print "Invalid Parameter: %s" % (area) 

myList=readCountries('countries.txt')

for i in range(0,len(myList)):  
    for j in range(0,len(myList)-1): 
        if myList[j][1]>myList[j+1]: 
            temp=myList[j]  
            myList[j]=myList[j+1]
            myList[j+1]=temp
if area < len(myList): 
    return myList[area-1] 
else:
    print "Invalid Parameter: %s" % (area)

我正在尝试确定哪些国家的人口和面积的顺序相同。如果一个国家/地区的人口数量排名第 7,面积排名第 7,则您的职能部门应报告该国家/地区及其排名(即第 7 位)。

我在想你可以复制返回整个有组织列表的两种类型,然后创建一个 for 循环来比较每个有组织列表中的元素,如果它们相同则打印它们

【问题讨论】:

    标签: python sorting


    【解决方案1】:

    我认为您比较两个排序列表的想法是正确的。我认为您在myList[j][1]&gt;myList[j+1]: 行中有一个错误,因为您正在将列表中的一个项目与另一个项目的属性进行比较。

    据我所知,您实现了冒泡排序算法。你不应该实现自己的排序算法,除非你有一些关于数据的额外信息告诉你这是最好的选择。即使在这种情况下,使用一些经过测试和大量使用的库总是更好。例如,在您的算法中,两个变量都没有必要从 0 迭代到 n。

    一个观察是你不应该读两次文件,你可以读一次然后复制内容。此外,由于您使用属性列表作为主列表的项目(它们是可变的),当您使用 list() 构造函数复制主列表时,只会复制项目的引用,从而更有效地使用内存(如果您只想修改一个列表中的项目,请考虑这一点)。在我们的例子中,我们只处理顺序,这不会影响元素。顺便说一句,我真的建议你阅读 pep-8。

    无论如何,您可以通过以下方式实现您想要的:

    by_name_list = read_countries('countries.txt')
    by_area_list = list(by_name_list) # a shallow copy of the list
    by_name_list.sort(key=lambda i: i[0]) # sort by name
    by_area_list.sort(key=lambda i: i[1]) # sort by area
    
    for k in xrange(len(by_name_list)):
        country_name = by_name_list[k][0]
        if by_area_list[k][0] == country_name:
            print 'Same order: %s in position %d'%(country_name, k)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-31
      • 1970-01-01
      • 1970-01-01
      • 2020-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多