比较Python中的列表

时间:2013-10-01 20:05:33

标签: python list sorting sorted

所以对于我的程序,我有两个定义,get_codes和get_data,我创建了8个总列表,如下所示:

CountryCodes=open("CountryCodes.csv",'r')
CountryData=open("CountryData.csv", 'r')

def get_codes(file):
    country_code=[]
    country_name=[]
    continent=[]

    for line in CountryCodes: 
        c_fields=line.split(",")

        c_field1=c_fields[0].strip()
        c_field2=c_fields[1].strip()
        c_field3=c_fields[2].strip() 

        country_code.append(c_field1)
        country_name.append(c_field2)
        continent.append(c_field3)

    return country_code, country_name, continent

def get_data(file): 
    data_country_code=[]
    country_pop=[]
    country_area=[]
    country_gdp=[]
    country_lit_rate=[]

    for line in CountryData: 
        d_fields=line.split(",")

        d_field1=d_fields[0].strip()
        d_field2=d_fields[1].strip()
        d_field3=d_fields[2].strip()
        d_field4=d_fields[3].strip()
        d_field5=d_fields[4].strip()

        data_country_code.append(d_field1)
        country_pop.append(int(d_field2))
        country_area.append(d_field3)
        country_gdp.append(int(d_field4))
        country_lit_rate.append(d_field5)

    return data_country_code, country_pop, country_area, country_gdp, country_lit_rate

现在我要做的是创建一个菜单选项(我有菜单),使country_pop按升序排列,然后降序排序。这是我到目前为止所做的:

def asc_sort():
    for x in range (0,len(country_pop)):
        country_pop2=sorted(country_pop)

我有整理,但我的教授不仅希望打印country_pop2。她还想要Countrycode中的country_name,而不是人口所在的CountryData。所以country_pop的索引x在data_country_code中也应该是x。然后我需要在data_country_code中输入x,让我们说它是AL,然后在country_code中找到它。接下来,我将需要找到相应的country_name,阿尔巴尼亚,country_code,AL,并列出country_name和country_pop,我认为这将是:

print("%-10s \t %-10s \t" %("NAMES","POPULATION"))
for ind in range (0,len(list1)):
    if ind%10==9:
        input("Press ENTER to continue")
    print("%-2s \t %-10s \t %-10s \t %-10s \t %-10s \t" %(I'd need help here)

(我需要%-10s部分用于格式化和if语句,因为我的列表很长,我只想要一次显示一些)任何帮助将不胜感激,如果有人需要更多解释我会做我最好的!

2 个答案:

答案 0 :(得分:2)

你需要做两件事:

  1. 将所有数据存储在一个元组中的CountryData中,而不是单独的列表中。这样,当您重新排列排序中的所有内容时,您还会重新排列县代码。

  2. 将CountryCodes中的数据存储在dict中,以便您可以从代码转到国家/地区名称。

  3. 我不确定我应该为你做所有的功课,但如果你有这样的数据:

    country_data = [('uk', 123), ('usa', 42), ('cl', 99)]
    country_names = {'uk': 'united kingdom', 'usa': 'united states', 'cl': 'chile'}
    

    然后这将为您提供按数字排序的国家/地区名称:

    sorted_data = sorted(country_data, key=lambda data: data[1])
    for (code, value) in sorted_data:
        print(country_names[code], value)
    

    注意key如何选择要排序的元组的第二个元素。所以,对于('uk', 123),它会给123,这就是你想要排序的。

答案 1 :(得分:2)

我认为以下代码可以满足您的需求:

with open("CountryCodes.csv",'r') as CountryCodes:
    genc = (line.split(',') for line in CountryCodes)

    c2n = dict((c_fields[0].strip(),c_fields[1].strip())
               for c_fields in genc)

with open("CountryData.csv",'r') as CountryData:
    gend = (line.split(',') for line in CountryData)

    the_data = [ (c2n[d_fields[0].strip()], # data_country_code
                  int(d_fields[1]),         # country_pop
                  d_fields[2].strip(),      # country_area
                  d_fields[3].strip(),      # country_gdp
                  d_fields[4].strip())      # country_lit_rate
                 for d_fields in gend ]

the_data.sort(key = lambda x: x[1])

p = 10
for i in xrange(0,len(the_data),p):
    if i:  raw_input("  Press ENTER to continue\n")
    print ('\n'.join("%-10s \t %-10s \t %-10s \t %-10s \t %s"
                     % el for el in the_data[i:i+p]) )

字典 c2n 给出与代码对应的名称。

population字段当然是一个字符串,表示一个不需要条带化的整数,即使其中有空格(空格,制表符......不是换行符)

修改

如果您没有被授权使用字典但只能使用列表,那么您可以这样做:

with open("CountryCodes.csv",'r') as CountryCodes:
    genc = (line.split(',') for line in CountryCodes)
    lic = [map(str.strip,row) for row in genc]

def name_of(x,lic=lic):
  for code,name,continent in lic:
    if x==code:
      return name

with open("CountryData.csv",'r') as CountryData:
    gend = (line.split(',') for line in CountryData)

    the_data = [ (name_of(d_fields[0].strip()), # data_country_code
                  int(d_fields[1]),         # country_pop
                  d_fields[2].strip(),      # country_area
                  d_fields[3].strip(),      # country_gdp
                  d_fields[4].strip())      # country_lit_rate
                 for d_fields in gend ]