我的知識很少,我花了幾天時間尋找解決方案,做測驗卻什么也沒做。
我在 Home Assistant 中有一個休息傳感器,它提供了一個 JSON,其中包含我所在地區所有加油站的未分類資料,這是其中的一部分:
{
"Fecha": "22/03/2022 12:10:11",
"ListaEESSPrecio": [
{
"C.P.": "09003",
"Dirección": "CL GENERAL SANZ PASTOR, S.N.",
"Horario": "L-V: 08:00-16:00",
"Latitud": "42,344667",
"Localidad": "BURGOS",
"Longitud (WGS84)": "-3,698667",
"Margen": "D",
"Municipio": "Burgos",
"PrecioProducto": "1,789",
"Provincia": "BURGOS",
"Remisión": "OM",
"Rótulo": "REPSOL",
"Tipo Venta": "P",
"IDEESS": "5989",
"IDMunicipio": "1220",
"IDProvincia": "09",
"IDCCAA": "08"
},
{
"C.P.": "09001",
"Dirección": "LOPEZ BRAVO, 93",
"Horario": "L-V: 06:30-22:00; S: 08:00-14:30",
"Latitud": "42,362528",
"Localidad": "BURGOS",
"Longitud (WGS84)": "-3,762083",
"Margen": "D",
"Municipio": "Burgos",
"PrecioProducto": "1,798",
"Provincia": "BURGOS",
"Remisión": "dm",
"Rótulo": "VILLALóN",
"Tipo Venta": "P",
"IDEESS": "9803",
"IDMunicipio": "1220",
"IDProvincia": "09",
"IDCCAA": "08"
},
{
"C.P.": "09001",
"Dirección": "CALLE CONDADO DE TREVI?O, 30",
"Horario": "L-D: 06:00-00:00",
"Latitud": "42,370528",
"Localidad": "BURGOS",
"Longitud (WGS84)": "-3,718528",
"Margen": "I",
"Municipio": "Burgos",
"PrecioProducto": "1,792",
"Provincia": "BURGOS",
"Remisión": "dm",
"Rótulo": "VILLALONQUEJAR",
"Tipo Venta": "P",
"IDEESS": "11878",
"IDMunicipio": "1220",
"IDProvincia": "09",
"IDCCAA": "08"
}]
}
然后在home assistant我有一張lovelace卡顯示5個最便宜的加油站的資料,代碼是這樣的:

- name: Gasolinera 1 nombre
value_template: "{{ value_json['ListaEESSPrecio'][0]['Rótulo'] }}"
- name: Gasolinera 1 precio
value_template: "{{ value_json['ListaEESSPrecio'][0]['PrecioProducto'] }}"
unit_of_measurement: "€"
- name: Gasolinera 1 dirección
value_template: "{{ value_json['ListaEESSPrecio'][0]['Dirección'] }}"
如您所見,我必須為每個加油站創建,它是 JSON 上的相關資料。
為了對我測驗過的 JSON 進行排序,它可以作業:
{% for item in ListaEESSPrecio | sort(attribute='PrecioProducto') %}
{{ item.Rótulo, item.PrecioProducto, item.Dirección }}
{%- endfor %}
這給了我所有排序的 JSON 資料,我也選擇了我感興趣的欄位:
('REPSOL', '1,789', 'CL GENERAL SANZ PASTOR, S.N.')
('VILLALONQUEJAR', '1,792', 'CALLE CONDADO DE TREVI?O, 30')
('VILLALóN', '1,798', 'LOPEZ BRAVO, 93')
現在的問題是,如何僅訪問所有字典或陣列中的一項以將其放在 lovelace 卡上,我在其中選擇每個傳感器資料到 JSON 上的資料。gas_station1.price = JSON 資料中第一個排序的加油站。
我已經測驗過這樣的事情,但沒有運氣。
{% for item in value_json['ListaEESSPrecio'][0] | sort(attribute='PrecioProducto') %}
{% if loop.index == 1 %}
{{ item.Rótulo, item.PrecioProducto, item.Dirección }}
{% endif %}
{% endfor %}
{% for item in ListaEESSPrecio | sort(attribute='PrecioProducto') if item[0] <= t <= item[1] %}
{{ item[0] }}
{% endfor %}
最后一次試驗給出了錯誤:
UndefinedError: dict object has no element 0
uj5u.com熱心網友回復:
您不需要回圈來實作這一點,您可以在first應用過濾器后使用過濾sort器從串列中僅拉出一項:
{% set item = ListaEESSPrecio | sort(attribute='PrecioProducto') | first %}
{{ item['Rótulo'], item['PrecioProducto'], item['Dirección'] }}
或者,使用方括號符號[ ]來訪問串列中的特定專案——請注意 Python 串列總是從 index 開始0:
{% set item = (ListaEESSPrecio | sort(attribute='PrecioProducto'))[0] %}
{{ item['Rótulo'], item['PrecioProducto'], item['Dirección'] }}
請注意,因為您的字典的屬性名稱中確實有西班牙口音,所以您可能也必須使用方括號表示法[ ]來訪問這些屬性。
uj5u.com熱心網友回復:
如果您希望根據 PrecioProducto 的值對結果進行排序:使用 sort(attribute=1.<dict_key>)
然后使用這樣的json:
>>> print(json.dumps(coffee, indent=4))
{
"Fecha": "22/03/2022 12:10:11",
"ListaEESSPrecio": [
{
"C.P.": "09003",
"Direcci\u00f3n": "CL GENERAL SANZ PASTOR, S.N.",
"Horario": "L-V: 08:00-16:00",
"Latitud": "42,344667",
"Localidad": "BURGOS",
"Longitud (WGS84)": "-3,698667",
"Margen": "D",
"Municipio": "Burgos",
"PrecioProducto": "1,789",
"Provincia": "BURGOS",
"Remisi\u00f3n": "OM",
"R\u00f3tulo": "REPSOL",
"Tipo Venta": "P",
"IDEESS": "5989",
"IDMunicipio": "1220",
"IDProvincia": "09",
"IDCCAA": "08"
},
{
"C.P.": "09001",
"Direcci\u00f3n": "LOPEZ BRAVO, 93",
"Horario": "L-V: 06:30-22:00; S: 08:00-14:30",
"Latitud": "42,362528",
"Localidad": "BURGOS",
"Longitud (WGS84)": "-3,762083",
"Margen": "D",
"Municipio": "Burgos",
"PrecioProducto": "1,798",
"Provincia": "BURGOS",
"Remisi\u00f3n": "dm",
"R\u00f3tulo": "VILLAL\u00d3N",
"Tipo Venta": "P",
"IDEESS": "9803",
"IDMunicipio": "1220",
"IDProvincia": "09",
"IDCCAA": "08"
},
{
"C.P.": "09001",
"Direcci\u00f3n": "CALLE CONDADO DE TREVI\u00d1O, 30",
"Horario": "L-D: 06:00-00:00",
"Latitud": "42,370528",
"Localidad": "BURGOS",
"Longitud (WGS84)": "-3,718528",
"Margen": "I",
"Municipio": "Burgos",
"PrecioProducto": "1,792",
"Provincia": "BURGOS",
"Remisi\u00f3n": "dm",
"R\u00f3tulo": "VILLALONQUEJAR",
"Tipo Venta": "P",
"IDEESS": "11878",
"IDMunicipio": "1220",
"IDProvincia": "09",
"IDCCAA": "08"
}
]
}
您可能正在使用 flask 和 html jinja 模板,但這里使用的是 jinja2 模板:
>>> from jinja2 import Template
>>> tm = Template("""
...
... {% for item in ListaEESSPrecio | sort(attribute=1.PrecioProducto) %}
... {{ item.Rótulo, item.PrecioProducto, item.Dirección }}
... {%- endfor %}
...
... """)
>>>
>>> result = tm.render(ListaEESSPrecio=coffee.get('ListaEESSPrecio'))
>>>
>>> print(result)
('REPSOL', '1,789', 'CL GENERAL SANZ PASTOR, S.N.')
('VILLALóN', '1,798', 'LOPEZ BRAVO, 93')
('VILLALONQUEJAR', '1,792', 'CALLE CONDADO DE TREVI?O, 30')
>>>
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/453660.html
