Dict python in l oop Json получает только последний элемент - PullRequest
0 голосов
/ 17 апреля 2020

Bot telegram with buttons Привет, я хотел бы создать кнопки на моем боте с телеграммой, которые зависят от списка '["Los Angeles", "New York"]'. У меня проблема с диктовкой python, когда я вставляю ее в al oop, json получает только последний элемент (Нью-Йорк). Кто-то может объяснить мне, почему?

import json
import time
from pprint import pprint
import telepot
from telepot.loop import MessageLoop
bot = telepot.Bot("token")
lista = ["Los Angeles","New York"]
for i in lista:
    dict = {"text": i}
    print(dict)
keyboard = {"keyboard": [[dict]]}


def handle(msg):
    content_type, chat_type, chat_id = telepot.glance(msg)
    print(content_type, chat_type, chat_id)

    if content_type == "text":
        bot.sendMessage(chat_id, msg["text"], reply_markup=keyboard)


MessageLoop(bot, handle).run_as_thread()
while 1:
    time.sleep(10)

1 Ответ

1 голос
/ 17 апреля 2020

Как уже упоминалось другими в комментариях, настоятельно рекомендуется НЕ использовать встроенное имя в качестве имени переменной (например, dict в коде вопроса), так как оно может вызывать проблемы в других частях кода, которые зависят от него. В приведенном ниже фрагменте я использовал имя listb вместо dict.


Я думаю, что вы хотите это:

lista = ["Los Angeles","New York"]
listb = []
for i in lista:
    listb.append({"text": i})
    print(listb)
keyboard = {"keyboard": [listb]}

Объяснение:

Эта строка: dict = {"text": i} не добавляет ключ к dict, она указывает переменную dict на совершенно новый словарь и отбрасывает старое значение. Таким образом, сохраняется только последнее значение.

В этом конкретном случае API Telegram ожидает список из нескольких словарей, каждый с ключом "text" в этом месте.

...