【问题标题】:Lookup element in python list using each value from another list使用另一个列表中的每个值在 python 列表中查找元素
【发布时间】:2017-07-01 03:39:59
【问题描述】:

我尝试过 for in 循环、while true 循环、next 等。要么我一遍又一遍地重复获取信息,要么一旦找到一个元素,循环就不会重新开始。我也在 SO 和 google 上搜索过解决方案,但没有成功。

我想要做的是:

for feature in parJson:
    ids = feature['properties']['id']
    event = feature['properties']['event']
    headline = feature['properties']['headline']
    expires = feature['properties']['expires']
    areaDesc = feature['properties']['areaDesc']
    geoCodes = feature['properties']['geocode']['UGC']

    states = alerts.getZones(geoCodes)

def getZones(self, getZones):
    zones = json.loads(open("resources/zones.json").read())
    parsedZones = zones['features']
    #TODO figure out how to compare this list!
    states = []
    for ugcCode in getZones:
        ugcCode = str(ugcCode)
        for element in parsedZones:
            ugc = element['properties']['id']
            state = element['properties']['state']
            if ugc == ugcCode:
                states.append(state)
                break

    print(states)

getZones 是 UGC 地理编码区域的列表。 parsedZones 是来自 api.weather.gov/alerts/active 的手表警告建议的 json 列表。

还有数据:

parsedZones:https://api.weather.gov/zones(下载到磁盘,因为它太大了)

parJson:https://api.weather.gov/alerts/active

从活动警报列表中,我获得了警告有效的 ugc 代码。 api 没有给出状态,只有那些代码。所以我需要将代码解码为州名。我已经有一本带有州名/缩写的字典。我需要的是一组基于警告中列出的 UGC 代码的独特状态的 python 集。一旦我有了状态,我可以使用它的缩写查找每个状态名称,然后显示状态。所以它会是这样的:

假设警告对德克萨斯州和俄克拉荷马州有效。提供的代码是 OKC001 和 TXC001。我不能只使用startswith 来获取前两个字母,因为有些地区不以州缩写开头。因此,我必须使用我下载到服务器的 api 提供的区域列表。我需要一次查找每个提供的代码并检索两个字母的缩写。我得到它之后就可以使用它了。但我似乎无法让它工作。目标是将每个州的缩写添加到一个集合中以获得唯一值。

到目前为止我所做的最终结果是这样的:

[] None
Severe Thunderstorm Watch
Windsor; Orange; Rutland
[] None [] None
Flood Warning
DeKalb; Marshall
['IN', 'IN', 'IN'] None
Special Weather Statement
Miami; Wabash; Huntington
['PA', 'PA', 'PA'] None
Special Weather Statement
Wyoming; Lackawanna; Luzerne
[] None
Flood Advisory
Sequoyah
['NY', 'NY', 'NY', 'NY', 'NY', 'NY', 'NY'] None
Special Weather Statement
Onondaga; Madison; Northern Oneida; Southern Oneida; Cortland; Otsego; Chenango

【问题讨论】:

  • 每次在“for”循环中循环时,都会覆盖上一次运行的信息。此代码会将所有这些变量设置为与它查看的最后一个值相对应的变量。
  • 感谢您提供的信息。我也试过这个,没有设置任何具有相同结果的变量。本质上,我最终得到了一些列出状态的行和一些没有列出状态的行。我猜这是由覆盖引起的..?
  • 你想要的输出是什么?
  • 最终目标是在页面上显示:德克萨斯州、俄克拉荷马州。理想情况下,我会有一个像这样的列表: ['TX', 'OK'] 然后我可以使用它从看起来像 {'Texas': 'TX', 'Oklahoma': 'OK '} 所以基本上: ['TXC001', 'OKC001'] 那么这会给我 ['TX', 'OK'] 然后 ['Texas', 'Oklahoma'] 我可以从中打印 Texas, Oklahoma 并且它会做这是每个警报。有些警报为同一州列出了多个 UGC 代码,所以在我得到州缩写后,我知道我可以使用一组来获取唯一值。

标签: python python-3.x


【解决方案1】:

您的问题是循环导致所有变量都被您循环遍历的每个元素覆盖。

states = []
for feature in parJson:
    ...
    states.append(alerts.getZones(geoCodes))
print(states)

这将生成相关状态的列表。您可能希望将此信息全部存储在嵌套字典中,每个状态都是一个键,如果您有其他信息而不是覆盖,您想知道的各种项目是您附加的列表...

【讨论】:

  • 谢谢,午饭后我会试试这个,然后告诉你会发生什么。
  • 好的,所以我必须打印循环内的状态,因为循环还呈现一个 html 模板。但是,我继续将列表添加到类方法中。我得到的基本上是我以前得到的。它不会为大多数元素打印任何状态。有时只打印它们。我会更新我的问题以说明我的意思。
【解决方案2】:

我发现了问题。我已经上传了一个带有区域的新文件,但它实际上并没有覆盖旧文件。使用 wget 检索文件并解决了问题。感谢@mauve 的建议。一旦我得到正确的数据,它确实对我的问题有所帮助。

【讨论】:

    猜你喜欢
    • 2016-05-25
    • 2017-04-28
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 2018-12-05
    • 1970-01-01
    相关资源
    最近更新 更多