Python:将一个列表的索引与另一个列表的索引进行比较,将第二个列表值附加到第一个列表

时间:2013-05-29 09:12:12

标签: python list loops indexing conditional

我有一个.csv文件如下(摘录)。

Country,Year,GDP ($US),Population
Angola,2002,11431738368,10760510
Angola,2005,32810672128,11706954
Antigua and Barbuda,2002,714677760,67448
Antigua and Barbuda,2005,875751360,68722
Argentina,2002,1.02E+11,38331121
Argentina,2005,1.83E+11,39537943
Armenia,2002,2376335104,3013818
Armenia,2005,4902779392,2982904
...

我需要找到2002年五个最低的GDP / Pop国家,然后在2005年找到相应的GDP / Pop值,然后计算差异和百分比差异。对于某些记录,GDP或人口值都有空白,我省略了。

到目前为止我用过

import csv
import operator

data = open('file.csv')
read_data = csv.reader(data)

thisthing = []
for line in read_data:
#find 2002 GDP/Pop, omit blanks, append to list
    if line[7] == '2002' and line[8] != ' ' and line[9] != ' ':
        thisthing.append([line[0], (float(line[8])/(int(line[9])))])

thisthing.sort(key=operator.itemgetter(1))

这会产生一个逐行打印的列表(国家,GDP / Pop):

['Burma (Myanmar)', 69.07171351277908]
['Burundi', 89.45864552423431]
['Congo (Dem. Rep.)', 99.23033109735835]
['Ethiopia', 109.33326343550823]
['Eritrea', 142.8576737907048]
['Guinea-Bissau', 151.110429668747]
['Afghanistan', 159.7524117568956]
['Malawi', 159.7614709537829]
['Sierra Leone', 174.6506490278577]

我想现在迭代回来'read_data',使用'thisthing'中的国家/地区名称作为条件以及我的空白预防条件

and line[8] != ' ' and line[9] != ' ':

选择并追加2005年GDP /流行音乐''thisthing'

我不知道从哪里开始这样做,而且我已经被困在这里大约一个星期......任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:0)

试试这个!!

import csv 
import operator

data = open('file.csv') read_data = csv.reader(data)

data_2002 = {}
data_2005 = {}

thisthing = [["country", "2002%", "2005%"]] 

for line in read_data:
    try: 
        gdp = float(line[8])/(int(line[9]))
        if line[7] == '2002' and line[8] != ' ' and line[9] != ' ':
            data_2002[line[0]] = gdp

        elif line[7] == '2005' and line[8] != ' ' and line[9] != ' ':
            data_2002[line[0]] = gdp
    except KeyError:
        print line[0]
        continue

for country in data_2002:
    thisthing.append([country, data_2002[country], data_2005[country]])

print thisthing

答案 1 :(得分:0)

将其用作read_data

[['Country', 'Year', 'GDP ($US)', 'Population'],
 ['Angola', '2002', '11431738368', '10760510'],
 ['Angola', '2005', '32810672128', '11706954'],
 ['Antigua and Barbuda', '2002', '714677760', '67448'],
 ['Antigua and Barbuda', '2005', '875751360', '68722'],
 ['Argentina', '2002', '1.02E+11', '38331121'],
 ['Argentina', '2005', '1.83E+11', '39537943'],
 ['Armenia', '2002', '2376335104', '3013818'],
 ['Armenia', '2005', '4902779392', '2982904']]

我们不想要第一行:

read_data = read_data[1:]

如果csv.read使用read_data对象,请执行:

next(read_data)

实际上,代码足够强大,可以迭代所有行 因为我们跳过了由转换字符串引起的异常行 到一个不起作用的数字,即'GDP ($US)''Population'。 但是,显示我们跳过第一行的意图仍然是一个好习惯。 因为我们都知道:明确比隐含更好。

我们使用defaultdict来避免在第一年插入时进行测试:

import collections
data = collections.defaultdict(dict)

for line in read_data:
    try:
        gdp = float(line[2]) / float(line[3])
    # Make sure this exception catches what you want.
    except (ValueError, ZeroDivisionError):
        continue
    data[line[0]][line[1]] = gdp

现在我们为data获取此内容:

{'Angola': {'2002': 1062.3788619684383, '2005': 2802.6651619200006},
 'Antigua and Barbuda': {'2002': 10595.981496856837,
                         '2005': 12743.391635866245},
 'Argentina': {'2002': 2661.023140961622, '2005': 4628.465370593508},
 'Armenia': {'2002': 788.4799626254804, '2005': 1643.6262756025671}}

我们需要重新排列才能进入您的列表:

list_data = []
for key, value in data.items():
    list_data.append([key] + [value[year] for year in sorted(value.keys())])

结果:

[['Antigua and Barbuda', 10595.981496856837, 12743.391635866245],
 ['Argentina', 2661.023140961622, 4628.465370593508],
 ['Angola', 1062.3788619684383, 2802.6651619200006],
 ['Armenia', 788.4799626254804, 1643.6262756025671]]

此解决方案可以使用多年,并按时间顺序排列。

修改

事实证明,这些数据包含了两年多的时间。我不想要这么多年。将最后一部分更改为仅包含您明确需要的年份:

list_data = []
for key, value in data.items():
    list_data.append([key] + [value[year] for year in ('2002', '2005')])

<强> EDIT2

如果OP要求缺少年份,则进行小幅修改:

list_data = []
for key, value in data.items():
    list_data.append([key] + [value.get(year, 0) for year in ('2002', '2005')])

如果缺少年份,则输入0。使用任何合适的其他值来表示缺失值。

<强> EDIT3

OP要求的另一种变体。如果没有值,则不附加:

list_data = []
for key, value in data.items():
    list_data.append([key] + [value.get(year) for year in ('2002', '2005')
                              if value.get(year) is not None])