Как перебрать несколько словарей json, чтобы проверить значение ключа того же типа? - PullRequest
0 голосов
/ 21 апреля 2019

Я хочу иметь возможность получить значение "delta" в нескольких словарях json.Я использую JsonStore от kivy, если это что-то меняет.Когда я нажимаю кнопку, которая запускает функцию check_streak, я получаю NameError: имя 'delta' не определено.Вот код:

class MainApp(App):

    def build(self): # build() returns an instance
        self.store = JsonStore("streak.json") # file that stores the streaks:


        return presentation

    def check_streak(self, instance):

        for item in self.store.find(delta):

            if delta > time.time():
                print("early")

            if delta == time.time():
                print("on time")

            if delta < time.time():
                print("late")

Вот словарь json в отдельном файле:

{"first": {"action": "first", "action_num": "1", "seconds": 60, "score": 0, "delta": 1555714261.0438898}, "second": {"action": "second", "action_num": "2", "seconds": 120, "score": 0, "delta": 1555879741.894656}}

Я хочу иметь возможность получать значение "delta" из каждого помещенного объектавнутри файла.Как бы я это сделал?

Ответы [ 3 ]

1 голос
/ 21 апреля 2019

Ну, переменная delta не существует, отсюда и ошибка.

Предположительно, вы имели в виду for item in self.store.find("delta"): (с дельтой в виде строки)?

0 голосов
/ 23 апреля 2019

Этот вопрос можно решить с помощью генератора предметов, чтобы получить значение 'delta'. Вот код:

class MainApp(App):

    def build(self): # build() returns an instance
        self.store = JsonStore("streak.json") # file that stores the streaks:


        return presentation

    # Gets the value of delta (code I may never understand lol)
    def item_generator(self, json_input, lookup_key):
        if isinstance(json_input, dict):
            for k, v in json_input.items():
                if k == lookup_key:
                    yield v
                else:
                    yield from self.item_generator(v, lookup_key)
        elif isinstance(json_input, list):
            for item in json_input:
                yield from self.item_generator(item, lookup_key)

    def check_streak(self, instance):
        with open("streak.json", "r") as read_file:
            data = json.load(read_file)
            values = self.item_generator(data, 'delta')



        for honey in values:
            if honey > time.time():
                print("early")

            if honey == time.time():
                print("on time")

            if honey < time.time():
                print("late")
0 голосов
/ 21 апреля 2019

Я думаю, вы могли бы попробовать что-то вроде этого, где dd равно self.store:

In [10]: my_deltas = []

In [11]: for key in dd:
    ...:     my_deltas.append(dd[key].get('delta'))
    ...:

In [12]: my_deltas
Out[12]: [1555714261.0438898, 1555879741.894656]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...