Python 字典只存储新字典条目中的最后一个值

Python dictionary only stores last values in new dictionary entries

我有一个包含(纬度、经度、时间)的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() 你可以创建一个生成器来同时循环你所有的可迭代对象。当压缩可迭代对象时,返回一个新的 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)]