我在管理大型Python2.7时遇到了困难:
我导入了一个包含三列的.csv:InputID
,TargetID
和distance
(两者之间)。
我已将所有值导入到一个列表中,该列表显示为:
['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
答案 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)
加上查找。