我有一个文本文件,其位置及其坐标位于新行上,例如
A&AB
42.289567
-83.717143
AH
42.276620
-83.739620)
我有一个for循环遍历此列表,如果该位置与用户输入匹配,则返回接下来的两行(纬度和经度)。如何使用Python以简洁的方式完成此操作?我知道如何用C ++做这个,但我不知道用Python。
答案 0 :(得分:1)
Python迭代器可以手动升级,也可以隐式升级。假设您只读一个值,而不是反复检查(并且不想因为某种原因将所有值存储在内存中),您可以这样做:
def find_latlong(locname, locfile):
with open(locfile) as f:
for line in f:
if line.rstrip() == locname:
try:
return float(next(f)), float(next(f))
except StopIteration:
break
raise ValueError("location {!r} not found".format(locname))
这只是在提供的文件中查找与提供的名称匹配的行,并在找到它时手动迭代以获得接下来的两行。
另一种假设确切的三行模式,并且不检查非名称行:
from future_builtins import map, zip # Only on Python 2
def find_latlong(locname, locfile):
with open(locfile) as f:
f = map(str.rstrip, f)
for header, lat, lng in zip(f, f, f): # Reads three lines at a time
if header == locname:
return float(lat), float(lng)
raise ValueError("location {!r} not found".format(locname))
答案 1 :(得分:1)
这是同一种汤的另一种方法:
def match(name):
with open("locat.txt") as f:
#gr = [iter(f)]*3
#for tag lat, lon in zip(*gr):
for tag, lat, lon in zip(f, f, f):
if tag.rstrip() == name:
return float(lat.rstrip('\n)')), float(lon.rstrip('\n)'))
return None
print(match('AY'))
print(match('xy'))
产生
(42.27, -83.73)
None
它只会尝试将给定名称与每个第三行匹配,如果找不到匹配则返回None
。
注意:没有错误检查,因此您需要确保输入数据是正确的(例如,如果任何条目缺少一行,即一个坐标值,它将无法工作。在这种情况下,另一个上面的答案检查每行的匹配将更好地工作并自动重新同步。
答案 2 :(得分:1)
from itertools import dropwhile
def get_data(fle, lne):
with open(fle) as f:
dw = dropwhile(lambda x: x.rstrip() != lne,f)
_, a, b = next(dw,""), next(dw, "").rstrip(")\n"), next(dw,"").rstrip(")")
return (a,b) if b else (None, None)
lat, lon = get_data("foo.txt","A&AB")
if lat:
# you have a match
答案 3 :(得分:-1)
查看这个答案,了解一些很棒的选择
点击here。
最简单的答案是您可以使用in
运算符或matches = [x for x in lst if fulfills_some_condition(x)]
。但请点击上面的链接获取更详细的答案。当然,假设您正在按照描述迭代列表。
答案 4 :(得分:-1)
作为一种语言,Python强调可读性。除了使用其他人提供的迭代器的高级解决方案之外,还有一个在文件对象上使用简单readline
方法:
with open(filename) as f:
while True:
desc =f.readline()
lat = f.readline()
lng = f.readline()
if not desc:
return None, None
if desc.strip() == wanted:
return float(lat), float(lng)
答案 5 :(得分:-2)
我认为你可以做的是建立一个元组列表,其中每个元组都是类型(位置,纬度,经度)
您可以按照以下方式执行此操作:
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:street_number, :email, :password, :password_confirmation, :remember_me, :avatar) }
devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:login, :email, :password, :remember_me) }
devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:street_number, :email, :password, :password_confirmation, :current_password) }
end
end