-1

我在CSV文件中有两列,我想用Python做一个循环,所以我可以将每个元素从一个列表匹配到另一个列表。我正在通过GoogleMaps API创建一个包含多个行程的文件。所以我实际上想要做的是将两个列表中每个元素的距离从源列表映射到目标列表。如何遍历不同长度的两列中的每个元素

这件事情是这样的:

origins = ['a', 'b', 'c', 'd'] 
destinations = ['E', 'F', 'G'] 

而且我想这样的输出:

Distances_from = ['aE', 'aF', 'aG', 'bE', 'bF', 'bG', 'cE', 'cF', 'cG', 'dE', 'dF', 'dG'] 

我的代码是:

destination_index=0 #city code 
destination_coordinates=10 
origin_index=12 
origin_coordinates=13 

reader=csv.reader(municipalities) 
writer=csv.writer(output) 

try: 
    for row in list(reader)[1:]: 
     destination_c=row[destination_coordinates] 
     origin_c=row[origin_coordinates] 

     destination_name=row[destination_index] 
     origin_name=row[origin_index] 

    for destination_coordinates, origin_coordinates in zip(destination_c, origin_c): 
     distances = gmaps.distance_matrix(origin_c, destination_c) 

     if distances['rows'][0]['elements'][0]['status'] == "OK": 
      writer.writerow((destination_name,origin_name, 
           distances['rows'][0]['elements'][0]['distance']['value'], 
           distances['rows'][0]['elements'][0]['duration']['value']))   
     else: 
      writer.writerow((destination_name,origin_name, 
          ".", 
          "."))   
finally: 
    municipalities.close() 
    output.close() 
+1

究竟是'A,B,...,E,F,G'?字符串?如果是这样,请使用一些引号。你试过什么了? –

+0

通过点击编辑链接,添加您的代码并解释所有这些内容。 –

+0

谢谢,我上传了我的代码,你能试试看我能做些什么来修复它吗? –

回答

0

列表解析会做什么:

origins=['a','b','c','d'] 
destinations=['E','F','G'] 

Distances_from = ["{}{}".format(x,y) for x in origins for y in destinations] 
print(Distances_from) 
# ['aE', 'aF', 'aG', 'bE', 'bF', 'bG', 'cE', 'cF', 'cG', 'dE', 'dF', 'dG'] 

显然,你需要改变你想要做的事(可能不是"{}{}".format(x,y))。

+0

谢谢,我上传了我的代码,你能试试看我能做些什么来修复它吗? –

0

它是那样简单嵌套的循环,你正在寻找:

for origin in origins: 
    for destination in destinations: 
     distance(origin, destination) 
     ... 

把它写在一个更简洁的方式,你可以这样做:

from functools import product 
for origin, destination in product(origins, destinations): 
    distance(origin, destination) 

或者使用列表理解:

distances = [distance(origin, destination) 
         for origin in origins 
         for destination in destinations] 
+1

...或使用列表理解... – Jan

+0

谢谢,我上传了我的代码,你能尝试看看我能做些什么来解决它吗? –

0

我想我几乎解决了它,我一直有一些问题,但我认为这是因为谷歌A PI而不是代码。 这是我使用的代码。

@JanHak

dest_f=open(os.path.join(dir,'Colombian_Municipalities.csv'),'r') 
orig_f=open(os.path.join(dir,'Origins.csv'),'r') 
output_f=open(os.path.join(dir,'Distances_to_Bogota.csv'),'w') 

# Constants 
dest_code_index=0 # detination city code 
dest_coord_index=10 # Coordinates from all municipalities in Colombia 
orig_code_index=0 # 
orig_coord_index=1 # Coordinates from markets and seaports 



dest_reader=csv.reader(dest_f) 
orig_reader=csv.reader(orig_f) 
output_writer=csv.writer(output_f) 
output_header=['Origin','Destination','Distance (meters)','Duration (seconds)'] 
output_writer.writerow(output_header) 


orig_reader_list=list(orig_reader) 
dest_reader_list=list(dest_reader)   


try: 

for dest_row in dest_reader_list[1:]: 

    dest_code=dest_row[dest_code_index] 
    dest_coord=dest_row[dest_coord_index] 


    for orig_row in orig_reader_list[1:]: 

     orig_code=orig_row[orig_code_index] 
     orig_coord=orig_row[orig_coord_index] 

     print(orig_code,dest_code) 

     distances=gmaps.distance_matrix(orig_coord, dest_coord) 

     if distances['rows'][0]['elements'][0]['status']=="OK": 
      output_writer.writerow((dest_code,orig_code, 
           distances['rows'][0]['elements'][0]['distance']['value'], 
           distances['rows'][0]['elements'][0]['duration']['value']))    
     else: 
      output_writer.writerow((dest_code,orig_code, 
          ".", 
          "."))   

finally: 
dest_f.close() 
orig_f.close() 
output_f.close()