Python 如何在不同长度的两列中迭代每个元素
我在一个CSV文件中有两列,我想用Python做一个循环,这样我可以将一个列表中的每个元素匹配到另一个列表中。我这样做是为了从GoogleMaps API创建一个包含多个行程的文件。所以我实际上想做的是,为两个列表中的每个元素映射从起点列表到目的地列表的距离 是这样的:Python 如何在不同长度的两列中迭代每个元素,python,python-3.x,google-maps-api-3,google-distancematrix-api,Python,Python 3.x,Google Maps Api 3,Google Distancematrix Api,我在一个CSV文件中有两列,我想用Python做一个循环,这样我可以将一个列表中的每个元素匹配到另一个列表中。我这样做是为了从GoogleMaps API创建一个包含多个行程的文件。所以我实际上想做的是,为两个列表中的每个元素映射从起点列表到目的地列表的距离 是这样的: origins = ['a', 'b', 'c', 'd'] destinations = ['E', 'F', 'G'] Distances_from = ['aE', 'aF', 'aG', 'bE', 'bF', 'bG
origins = ['a', 'b', 'c', 'd']
destinations = ['E', 'F', 'G']
Distances_from = ['aE', 'aF', 'aG', 'bE', 'bF', 'bG', 'cE', 'cF', 'cG', 'dE', 'dF', 'dG']
我想要这样的输出:
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()
一份清单可以:
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)
)。它是否像嵌套for循环一样简单,您正在搜索:
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]
我想我几乎解决了它,我一直有一些问题,但我认为这是因为谷歌的API,而不是代码。 这是我使用的代码 @詹哈克
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()
a、b、…、E、F、G到底是什么?串?如果是,请使用一些引号。到目前为止,您尝试了什么?通过点击
edit
链接添加您的代码以及对问题正文中所有内容的解释。谢谢,我上传了我的代码,您可以尝试看看我能做些什么来修复它吗?您希望此代码做些什么,目前输出的是什么?你可以发布一个csv的链接吗。给你带来麻烦的文件?谢谢,我上传了我的代码,你能试试看我能做些什么来修复它吗?谢谢,我上传了我的代码,你能试试看我能做些什么来修复它吗?