作为一个学习项目,我正在制作交通事故热图。我有一个.csv文件,其中包含所有交叉点的纬度和经度,以及每个交叉口的事故数量。我需要的是一个包含每次事故的所有纬度 - 经度对的列表。
e.g。
2,1.2,4.2
2,2.2,5.2
2,3.2,6.2
成为:[(1.2,4.2),(1.2,4.2),(2.2,5.2),(2.2,5.2),(3.2,6.2),(3.2,6.2)]
这是我的代码:
import csv
with open('file.csv','rb') as f:
reader = csv.reader(f)
lat = []
lon = []
num = []
for row in reader:
num.append(row[0])
lat.append(row[1])
lon.append(row[2])
def prep(a,b):
d = [str(x)*y for x,y in zip(a,b)]
for i in d:
d = [list(i) for i in d]
d = sum(d, [])
d = [int(i) for i in d]
return d
e = zip(prep(lat, num), prep(lon, num))
for i in e:
print "new google.maps.LatLng", i, ","
我用包含整数的列表测试了函数,它工作得很好;然而,它似乎不喜欢花车。这是我收到的错误消息:
d = [str(x)*y for x,y in zip(a,b)]<br/>
TypeError: can't multiply sequence by non-int of type 'str'
有没有人知道解决方案,因为我花了2天时间修补/谷歌搜索。
答案 0 :(得分:1)
如果你只想要配对,那就非常简单了:
with open('in.txt','rb') as f:
reader = csv.reader(f)
print [tuple(map(float,row[1:])) for row in reader for _ in xrange(int(row[0]))]
[(1.2, 4.2), (1.2, 4.2), (2.2, 5.2), (2.2, 5.2), (3.2, 6.2), (3.2, 6.2)]
答案 1 :(得分:1)
我认为错误是明确的:你不能将str乘以str,即你没有将字符串转换为浮点数或整数。
因为你的方法非常难以解决,我建议使用列表理解以更容易和更容易理解的方式制作你想要的东西:
with open('file.csv','rb') as f:
reader = csv.reader(f)
e = [(float(lon), float(lat)) for num, lat, lon in reader for i in range(int(num))]
for i in e:
print "new google.maps.LatLng", i, ","
答案 2 :(得分:0)
如何只使用列表推导表达式和itertools.chain
?
>>> l1=(2,1.2,4.2)
>>> l2=(2,2.2,5.2)
>>> l3=(2,3.2,6.2)
>>> l=[l1,l2,l3]
>>> from itertools import chain
>>> list(chain(*[[(j,k) for t in range(i)]for i,j,k in l]))
[(1.2, 4.2), (1.2, 4.2), (2.2, 5.2), (2.2, 5.2), (3.2, 6.2), (3.2, 6.2)]