2

所以对于我的程序,我有两个定义,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。她还想要 CountryCodes 中的 country_name,而不是人口所在的 CountryData。所以 country_pop 的索引 x 也应该是 data_country_code 中的 x。然后我需要在data_country_code中输入x,假设它是AL,然后在country_code中找到它。接下来,我必须找到对应的 country_name,Albania,到 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 语句,因为我的列表很长,我一次只希望显示几个)任何帮助将不胜感激,如果有人需要更多解释,我会尽力而为!

4

2 回答 2

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给出了与代码对应的名称。

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

.

编辑

如果您无权使用字典而只能使用列表,那么您可以这样做:

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 ]
于 2013-10-01T22:30:34.910 回答
2

你需要做两件事:

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

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

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

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,这是你想要排序的。

于 2013-10-01T21:25:39.803 回答