【问题标题】:Python dictionary only stores last values in new dictionary entriesPython 字典仅将最后一个值存储在新字典条目中
【发布时间】:2020-07-21 17:20:17
【问题描述】:

我有一个包含(纬度、经度、时间)的 netcdf 文件 (data1),我想提取特定的(纬度、经度)点。为此,我使用字典。

lats=[20,40]
lons=[-135,-75]
names=['jib', 'jibb']
d={}
for i in lats:
    for j in lons:
        for k in names:
            d[k]=data1.sel(latitude=i).sel(longitude=j)

这只是一个数据没有意义的例子。但是,当我打印出jibjibb 时,它们的纬度和经度完全相同。为什么是这样?我想要的是jib 有 lat=20 和 lon=-135,而jibb 有 lat=40 和 lon=-75。

d['jib']


time: 44160
Coordinates:
longitude
()
float32
-75.0
latitude
()
float32
40.0

d['jibb']


time: 44160
Coordinates:
longitude
()
float32
-75.0
latitude
()
float32
40.0

【问题讨论】:

  • 使用zip() 会很有帮助,不需要嵌套循环
  • 你正在迭代你的两个 lats、两个 lons 和两个名字的所有八个排列。只有与每个名称一起存储的最后一个值保留在字典中,因为它们覆盖了以相同名称存储的三个先前的排列。
  • 如何防止这种情况发生?
  • 另外,我不熟悉 zip()。随意提出一个包含它的解决方案。
  • 很好,这可以按要求工作!

标签: python dictionary for-loop python-xarray


【解决方案1】:

使用zip(),您可以创建一个同时循环遍历所有可迭代对象的生成器。压缩可迭代对象时,将返回一个新的 iterable,其中包含来自所提供的每个 iterablesame-index 值的元组。

#Example Zip Return ~ based on your data

names = ['jib', 'jibb']
lats  = [20,40]
lons  = [-135,-75]

print(list(zip(names, lats lons)))  #[('jib', 20, -135), ('jibb', 40, -75)]

当您在生成器中使用zip() 时,您只是在每次迭代中解压缩这些元组。

#Solution: 

d = {k:data1.sel(latitude=lt).sel(longitude=ln) for k, lt, ln in zip(names, lats, lons)}

注意事项:

  • 如果提供给zip() 的迭代器长度不同,则从zip() 返回的iterable 的长度将与提供的最短迭代器相同。
    a = [1, 2, 3]
    b = ['a', 'b']
    
    print(list(zip(a, b)))  #[(1, 'a'), (2, 'b')]
    
  • 提供的迭代不必在类型上匹配,它们只需符合iterable 类型即可。
    a = (1, 2, 3)
    b = ['a', 'b', 'c']
    c = range(3)
    
    print(list(zip(a, b, c)))  #[(1, 'a', 0), (2, 'b', 1), (3, 'c', 2)]
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 2019-09-20
    • 2018-03-31
    相关资源
    最近更新 更多