Python在字典列表中查找匹配项

jchrr9hc  于 2023-03-28  发布在  Python
关注(0)|答案(6)|浏览(124)

我有一个很大的字典列表。每个字典包含每个传感器在收集每个数据点时的时间序列数据。我想知道特定传感器的索引位置和日期。所以,我可以更新传感器值。我的代码:

big_list = [
dict({'sensor':12,'time':'2022-02-03','value':10}),
dict({'sensor':22,'time':'2022-02-03','value':12}),
dict({'sensor':32,'time':'2022-02-03','value':24}),
dict({'sensor':12,'time':'2022-02-04','value':17}),
dict({'sensor':22,'time':'2022-02-04','value':13}),
dict({'sensor':32,'time':'2022-02-04','value':21})]

# Find index of an item 
item_to_find = dict({'time':'2022-02-03','sensor':32})
# solution
big_list.index(item_to_find)

当前输出:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: {'sensor': 32, 'time': '2022-02-03'} is not in list

预期产出:

2
s8vozzvw

s8vozzvw1#

我知道这可能不是最有效的解决方案,但这是我能做的最好的了。:)

sensor = 32
time = '2022-02-03'

for item in big_list:
    if item.get('sensor') == sensor and item.get('time') == time:
        print(big_list.index(item))
h4cxqtbf

h4cxqtbf2#

你可以试试next() + enumerate()

idx = next(
    i for i, d in enumerate(big_list) if all(d[k] == v for k, v in item_to_find.items())
)
print(idx)

图纸:

2

或者:如果找不到项目,您可以将默认参数添加到next()

# returns None if the item is not found
idx = next(
    (i for i, d in enumerate(big_list) if all(d[k] == v for k, v in item_to_find.items())), None
)
print(idx)
lyr7nygr

lyr7nygr3#

与@Andrej的想法相同,但您可以使用lambda函数来更清晰地表达意图

same_time_and_sensor = lambda item: item['sensor'] == item_to_find['sensor'] and item['time'] == item_to_find['time']

index = next((i for i, item in enumerate(big_list) if same_time_and_sensor(item)), None)

print(index)

这里next()将返回第一个匹配的索引,如果没有找到匹配,则返回None

lmvvr0a8

lmvvr0a84#

如果你正在寻找一个特定的datesensor,你可以做一个循环来迭代列表中的每个字典,并将匹配项的索引保存在索引列表中:

sensor = 32
date = '2022-02-03'

ind = []
for idx, dt in enumerate(big_list):
    if dt['sensor'] == sensor and dt['time'] == date:
        ind.append(idx)

print(ind)
nukf8bse

nukf8bse5#

试试这个:

list(
    map(
        lambda x: {'time': x['time'], 'sensor': x['sensor']} == item_to_find,
        big_list
    )
).index(True)

说明:

  • 使用map()提取要比较的值,去掉value
  • 在被Map的函数中,与item_to_find进行比较-这将返回一个迭代器,该迭代器将产生True(匹配)或False(不匹配)。
  • 将结果迭代器转换为list()的列表
  • 查找True列表中的第一个匹配项并返回索引。

您可能还想看看pandas,它使所有这些都更容易处理。

nzkunb0c

nzkunb0c6#

我也在网上找到了答案:

solution_item = next(filter(lambda s: s['time']==item_to_find['time'] and s['sensor']==item_to_find['sensor'],big_list))

{'sensor': 32, 'time': '2022-02-03', 'value': 24}

溶液索引

big_list.index(solution_item)

2

相关问题