首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >组织排序

组织排序
EN

Stack Overflow用户
提问于 2015-11-17 09:53:25
回答 1查看 55关注 0票数 0

我有一个名为countries.txt的列表,它列出了所有国家的名称,面积(在km2中),人口(例如,["Afghanistan",647500.0,25500100])。

代码语言:javascript
复制
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])

我还有两个排序算法:

代码语言:javascript
复制
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')

代码语言:javascript
复制
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循环来比较每个有序列表中的元素,如果它们是相同的,则打印它们

EN

回答 1

Stack Overflow用户

发布于 2015-11-17 12:13:22

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

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

一个观察结果是,您不应该重复读取该文件,您可以先读取一次,然后复制内容。此外,由于您使用属性列表作为主列表的项(这些属性是可变的),因此当您使用list()构造函数复制主列表时,仅复制项的引用,从而更有效地使用内存(如果您只想修改一个列表中的项,请考虑这一点)。在我们的情况下,我们只在订单上工作,这不会冒险elements.By的方式,我真的建议你阅读pep-8。

无论如何,你可以实现你想要的东西,如下所示:

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33747854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档