【问题标题】:Python: Trouble organizing list values imported from .csvPython:无法组织从 .csv 导入的列表值
【发布时间】:2014-06-02 14:35:01
【问题描述】:

我在管理 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编程还是很陌生,所以如果有什么我可以做的进一步澄清,请告诉我!

我非常感谢任何 cmets/建议。

-邮递员

【问题讨论】:

  • 我想你忘了说到底是什么问题 ;-)
  • 蒂姆,感谢您的快速回复。我会尝试更具体一点:我正在使用一个逗号分隔值列表。这些值代表表中的三列。我需要以某种方式将所有具有相似 InputID 的“行”分开。一旦我只有包含相似 InputID 的记录,我想选择距离最短的 TargetID,然后将 TargetID 现在作为 InputID 重复该过程。例如:list = [1,2,5,1,3,10,1,4,50] 对于 InputID1:TargetID2 距离为 5 个单位,TargetID3 距离为 10 个单位,TargetID4 距离为 50 个单位。 TargetID2 应该成为新的 InputID。
  • 恕我直言,您不需要将所有值都转换为字符串,因为您所有的比较都将是字符串比较,而不是数字并且字符串排序为“100”

标签: list python-2.7 csv


【解决方案1】:

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

除了ids[] 更新之外,阅读顺序就像您现在拥有的一样。加载完成后,就可以开始处理了。您需要创建一个距离最短的数组并对其进行更新,这意味着您需要对您的值进行两次遍历(此外,它还需要遍历另一个列表)。

如果没有理由拥有平面列表,我会构建类似 dict of 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])

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

【讨论】:

  • 劳尔,谢谢!这绝对是朝着正确方向迈出的一步。但是,当我运行您提供的脚本时,出现错误:#line31 #for target_key in ids[input_key].keys: #TypeError: 'builtin_function_or_method' object is not iterable。知道什么可能会触发此错误吗?
  • @user3699687 添加一个(),所以.keys()
  • @user3699687:见上面的评论。我已经更新了脚本以反映这一点:)
猜你喜欢
  • 2018-05-03
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 2016-10-03
  • 2018-05-06
  • 2014-08-31
相关资源
最近更新 更多