Python:无法组织从.csv导入的列表值

时间:2014-06-02 14:35:02

标签: list python-2.7 csv

我在管理大型Python2.7时遇到了困难:

我导入了一个包含三列的.csv:InputIDTargetIDdistance(两者之间)。 我已将所有值导入到一个列表中,该列表显示为:

['InputID1','TargetID1','Distance1','InputID1','TargetID2','Distance2',InputID1','TargetID3','Distance3',...]

因此,对于每个InputID,有三个相应的TargetID。

我要做的是将包含类似InputID的所有记录分组,并找到具有最短距离的相应TargetID。确保一旦找到,就不会重复InputID / TargetID。

这是我到目前为止所拥有的:

import csv

ids=[]     ##Unique InputID list##
e=[]       ##Empty .csv list##
f=open("D_Matrix.csv")
csv_f = csv.reader(f)
n=0

for row in csv_f:
    str_list0=str(row[0])
    str_list1=str(row[1])
    str_list2=str(row[2])
    while n>0:
        x=str_list0       ##InputID##
        y=str_list1       ##TargetID##
        z=str_list2       ##Distance##
        if not x in ids:
            ids.append(x)
        e.append(x)     ##Add Origin to list e##
        e.append(y)     ##Add Target to list e##
        e.append(z)     ##Add Distance to list e##
        break
    else:
        n+=1         ##Prevents column labels from being added to list

print e
f.close()

我对python编程还很陌生,所以请告诉我是否有什么可以做进一步澄清的事情!

我非常感谢任何意见/建议。

-Mailman

1 个答案:

答案 0 :(得分:0)

如果您需要拥有平面列表,那么恕我直言,您应首先阅读数据并构建您的列表,然后处理已创建的列表。

阅读顺序就像现在一样,但ids[]更新除外。加载后,即可开始处理。你需要创建一个具有最短距离的数组并更新它,这意味着你需要对你的值进行两次(加上迭代另一个列表需要)。

如果没有理由拥有平面清单,我会建立类似于dicts的词典:

import csv

ids = {}

f=open("D_Matrix.csv")
csv_f = csv.reader(f)
n=0

for row in csv_f:
    str_list0=str(row[0])
    str_list1=str(row[1])
    str_list2=str(row[2])

    if not str_list0 in ids.keys():
        ids[str_list0] = {}

    input_dict = ids[str_list0]

    if not str_list1 in input_dict.keys():
        input_dict[str_list1] = str_list2 # your value
    else:
        # we already have the key, check if the new value is shorter:
        #
        if input_dict[str_list1] > str_list2:
            input_dict[str_list1] = str_list2

# Now you have a dict like:
#
# {'InputID1': {'TargetID1' : minimum target distance}}
for input_key in ids.keys():
    for target_key in ids[input_key].keys():
        print "In: [%s], Tgt: [%s], Min distance: [%s]" % \
            (input_key, target_key, ids[input_key][target_key])

这样做的好处是你只需要在dict中迭代一次O(n)加上查找。