所以对于我的程序,我有两个定义,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语句,因为我的列表很长,我只想要一次显示一些)任何帮助将不胜感激,如果有人需要更多解释我会做我最好的!
答案 0 :(得分:2)
你需要做两件事:
将所有数据存储在一个元组中的CountryData中,而不是单独的列表中。这样,当您重新排列排序中的所有内容时,您还会重新排列县代码。
将CountryCodes中的数据存储在dict中,以便您可以从代码转到国家/地区名称。
我不确定我应该为你做所有的功课,但如果你有这样的数据:
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 ]