Манипулировать этим словарем, чтобы вернуть желаемый результат? - PullRequest
0 голосов
/ 05 февраля 2020

Я работаю со словарем, который содержит под-словари. Я хотел бы преобразовать это в пригодный для использования формат, чтобы я мог вернуть только желаемое значение / вывод.

РЕДАКТИРОВАТЬ - я должен добавить для контекста, что это текстовое приложение. Клавиша верхнего уровня соответствует определенному «разговору», в то время как подключи являются отдельными «сообщениями». Функция, которую я пытаюсь создать, должна иметь возможность возвращать текст самого нового «сообщения» из любого данного словаря «разговора», предоставленного в качестве входных данных.

Вот пример словаря:

mydict = {1005672: {4461048: {'body': 'Mnow test test', 'msg_id': 4461048},
                    4620511: {'body': 'test sms,test sms', 'msg_id': 4620511},
                    4620584: {'body': 'test sms', 'msg_id': 4620584},
                    4646648: {'body': 'test sms', 'msg_id': 4646648},
                    4646877: {'body': 'test sms', 'msg_id': 4646877},
                    5327736: {'body': 'testing again\r\n', 'msg_id': 5327736},
                    5332767: {'body': 'testing testing 1..2...3...', 'msg_id': 5332767},
                    5333204: {'body': 'testing the convID part...', 'msg_id': 5333204},
                    5333257: {'body': 'take 2!', 'msg_id': 5333257},
                    5333489: {'body': 'aaaaaaaaaaaand ACTION!', 'msg_id': 5333489},
                    5337141: {'body': 'does it work?', 'msg_id': 5337141},
                    5363443: {'body': 'Test', 'msg_id': 5363443},
                    5365638: {'body': 'testing again', 'msg_id': 5365638},
                    5366005: {'body': 'testing sms ID', 'msg_id': 5366005}}}

Это позволяет мне явно возвращать заданные c ключи, подобные этой (что является хорошим началом):

print(mydict[1005672][5366005])

Однако мне нужно написать функцию, которая может возвращать только текст «body» для элемента last (или самого нового). Например, я хотел бы, чтобы функция возвращала 'testing sms ID', для этого примера.

Я бы предположил, что способ go об этом будет сначала преобразовать в список, а затем срезать?

mylist = list(mydict.values())
myslice = mylist[-1:]

Однако, когда я это делаю, это не работает, и продолжает возвращать всю вещь (хотя, теперь в формате списка!)

Так что я хотел бы получить некоторые рекомендации о том, как это сделать - сначала нарежьте список, чтобы взять только последнюю строку, но затем, как бы Я go о захвате только текста между '' после тела?

Я ценю любой вклад в это. Я все еще учусь, поэтому я ценю любые полезные советы. Спасибо

Ответы [ 4 ]

1 голос
/ 06 февраля 2020

Я думаю, что приведенный ниже код должен работать.

def r(dictionary):
    val = dictionary.values()
    for element in val:
        if not isinstance(element, dict):
            last_element = val
        else:
            last_element = element

    if isinstance(last_element, dict):
        r(last_element)
    else:
        for i in last_element:
          a = i
          break
        print(a)

, так что вы можете просто вызвать функцию и передать в словаре аргумент

1 голос
/ 05 февраля 2020

словарь странный. Это вложено. На самом высоком уровне есть только одна пара ключ / значение.

Извлеките ее, затем сортируйте словарь, содержащийся в качестве значения, и работайте с доступом по подписке / ключу:

>>> sorted(list(mydict.values())[0].items())[-1][1]["body"]
'testing sms ID'

обратите внимание, что если порядок словаря гарантирован (python 3.6), сортировка ключей (при условии, что самый высокий ключ - последний вставленный) - лучший метод.

1 голос
/ 05 февраля 2020

Не функция, но вот один из способов сделать это:

dlookup = {k: max(v.keys()) for k, v in mydict.items()}

myid = 1005672
mydict[myid][dlookup[myid]]['body']

Это выдаст testing sms ID

1 голос
/ 05 февраля 2020

Это должно работать:

mydict = {1005672: {4461048: {'body': 'Mnow test test', 'msg_id': 4461048},
           4620511: {'body': 'test sms,test sms', 'msg_id': 4620511},
           4620584: {'body': 'test sms', 'msg_id': 4620584},
           4646648: {'body': 'test sms', 'msg_id': 4646648},
           4646877: {'body': 'test sms', 'msg_id': 4646877},
           5327736: {'body': 'testing again\r\n', 'msg_id': 5327736},
           5332767: {'body': 'testing testing 1..2...3...', 'msg_id': 5332767},
           5333204: {'body': 'testing the convID part...', 'msg_id': 5333204},
           5333257: {'body': 'take 2!', 'msg_id': 5333257},
           5333489: {'body': 'aaaaaaaaaaaand ACTION!', 'msg_id': 5333489},
           5337141: {'body': 'does it work?', 'msg_id': 5337141},
           5363443: {'body': 'Test', 'msg_id': 5363443},
           5365638: {'body': 'testing again', 'msg_id': 5365638},
           5366005: {'body': 'testing sms ID', 'msg_id': 5366005}}}

def get_latest(my_dict):
    latest_key = max(my_dict.keys())
    return my_dict[latest_key]["body"]


my_new_dict = {k: get_latest(mydict[k]) for k in mydict.keys()}

conversation_id = 1005672

my_new_dict[conversation_id]
>>> 'testing sms ID'

get_latest(mydict[conversation_id])
>>> 'testing sms ID'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...