Вложенные словари в структуре словаря в Python, хотели бы выводить определенным образом - PullRequest
0 голосов
/ 18 сентября 2018

Я выполнил анализ переполнения стека, чтобы найти ответ на этот вопрос, но он кажется немного конкретным, я рад перейти к вашим ссылкам, если вы их предложите.

A.У меня есть словарь, содержащий несколько словарей в этом формате:

Key  :  {Nested_Key: Nested_Value}

Key = Document ID, Data Type is String
Nested Key = Token ID, Data Type is Integer
Nested Value = Count of Token ID, Data Type is Integer

Пример:

d = { '441' : {201:1, 220:1, 232:1, ..., 23231:4}, 
      '4452' : {203:43, 2202: 45} }

B: Я хотел бы иметь возможностьчтобы вывести их в текстовый файл в следующем формате:

document_(key), nested_key:nested value, nested_key:nested value \n
document_(key+1), nested_key:nested value, nested_key: nested value \n

Я могу довольно близко приблизиться к тому, что я хочу, используя этот код:

with open("text.txt", "w") as f:
    for key, token in dict.items():
        f.write('doc%s,%s\n' % (key, token))

Но каквы ожидаете, что он выведет вложенный ключ и вложенное значение в своем словаре

doc_441, {201: 1, 220: 1, 232: 1, 240: 1, 241: 1, 242: 1,243: 1, 245: 1, 246: 1, 250: 1, 255: 1, 260: 1, 271: 1, 493: 1, 494: 1, 540: 1, 608: 1, 609: 1, 610:1, 611: 1, 612: 1, 613: 1, 614: 1, 835: 1, 836: 1, 965: 1, 966: 1, 967: 1, 986: 1, 1291: 1, 1292: 1,1734: 1, 1735: 1, 1736: 1, 1748: 1, 1749: 1, 1762: 1, 1763: 1, 1818: 1, 1819: 1, 1820: 1, 1821: 1, 1822: 1, 1875:1, 1881: 1, 1882: 1, 1883: 1, 1890: 1, 1891: 1, 1941: 1, 1947: 1, 1948: 1}

doc_577, {201: 1, 205: 1, 217: 1, 232: 1, 233: 1, 235: 1, 236: 1, 237: 1, 238: 1, 241: 1, 242: 1, 243: 1, 244: 1, 245: 1, 246: 1, 247: 1, 248: 1, 249: 1, 250: 1, 251: 1, 280: 1, 448: 1, 493: 1, 494: 1, 537: 1, 540: 1, 571: 1, 572:1, 573: 1, 574: 1, 575: 1, 669: 1, 670: 1, 671: 1, 672: 1, 673: 1, 674: 1, 675: 1, 690: 1, 731: 1,732: 1, 733: 1, 734: 1, 735: 1, 736: 1, 770: 1, 771: 1, 772: 1, 773: 1, 777: 1, 947: 1, 948: 1, 949:1, 950: 1}

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

combined_file_content = ""

# For Key, Token pair in dict
for key, token in dict.items():
    for nest_key, nest_token in iter(token.items()):
        file_content = ""
        # This side works
        int_id = ""
        # Set int_id = doc_(key).txt,
        int_id = "doc_" + '(' + key + ')' + '.txt' + ','

        # Then for token dictionary,
        # For nested key, nested token pair in token dictionary
        # Set int_value = key:value
        int_value = ""
        nested_key = nest_key
        nested_token = nest_token

        int_value += (str(nested_key) + ":" + str(nested_token))
        #print(str(nested_key) + ":" + str(nested_token))

        combined_nest = int_id + int_value + "\n"
        file_content += combined_nest
    combined_file_content += file_content

Вывод: docresume_(441).txt,4334:1\nresume_(577).txt,4344:1\ndoc_(220).txt,4305:1\n

Любая помощь будет принята с благодарностью.Спасибо.

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Вы были почти там, это должно сделать это:

d = {'doc_441' :{201: 1, 220: 1, 232: 1, 240: 1, 241: 1, 242: 1, 243: 1, 245: 1, 246: 1, 250: 1, 255: 1, 260: 1, 271: 1, 493: 1, 494: 1, 540: 1, 608: 1, 609: 1, 610: 1, 611: 1, 612: 1, 613: 1, 614: 1, 835: 1, 836: 1, 965: 1, 966: 1, 967: 1, 986: 1, 1291: 1, 1292: 1, 1734: 1, 1735: 1, 1736: 1, 1748: 1, 1749: 1, 1762: 1, 1763: 1, 1818: 1, 1819: 1, 1820: 1, 1821: 1, 1822: 1, 1875: 1, 1881: 1, 1882: 1, 1883: 1, 1890: 1, 1891: 1, 1941: 1, 1947: 1, 1948: 1},
'doc_577' : {201: 1, 205: 1, 217: 1, 232: 1, 233: 1, 235: 1, 236: 1, 237: 1, 238: 1, 241: 1, 242: 1, 243: 1, 244: 1, 245: 1, 246: 1, 247: 1, 248: 1, 249: 1, 250: 1, 251: 1, 280: 1, 448: 1, 493: 1, 494: 1, 537: 1, 540: 1, 571: 1, 572: 1, 573: 1, 574: 1, 575: 1, 669: 1, 670: 1, 671: 1, 672: 1, 673: 1, 674: 1, 675: 1, 690: 1, 731: 1, 732: 1, 733: 1, 734: 1, 735: 1, 736: 1, 770: 1, 771: 1, 772: 1, 773: 1, 777: 1, 947: 1, 948: 1, 949: 1, 950: 1}}


combined_file_content = ""
# For Key, Token pair in dict
for key, token in d.items():
    file_content = ""
    int_id = "doc_" + '(' + key + ')' + '.txt' + ','
    for nest_key, nest_token in iter(token.items()):

        # Then for token dictionary,
        # For nested key, nested token pair in token dictionary
        # Set int_value = key:value
        int_value = ""
        nested_key = nest_key
        nested_token = nest_token

        int_value += (str(nested_key) + ":" + str(nested_token))
        file_content += int_value
    combined_file_content += int_id + file_content + "\n"
print(combined_file_content)

Вывод

doc_(doc_441).txt,260:11948:11291:11292:1271:11941:11818:11819:1540:11821:11822:11947:11734:11891:11820:11735:11890:1835:1836:1965:1966:1967:11736:1201:11875:11882:1610:1611:11748:11749:11881:1986:11883:1220:1608:1609:11762:11763:1612:1613:1614:1232:1493:1494:1240:1241:1242:1243:1245:1246:1250:1255:1
doc_(doc_577).txt,770:1771:1772:1773:1777:1237:1238:1280:1537:1540:1669:1670:1671:1672:1673:1674:1675:1690:1947:1948:1949:1950:1571:1572:1573:1574:1575:1448:1201:1205:1217:1731:1732:1733:1734:1735:1736:1232:1233:1235:1236:1493:1494:1241:1242:1243:1244:1245:1246:1247:1248:1249:1250:1251:1

В качестве примечания избегайте вызова словарей dict,Название dict уже определено как функция для создания словарей.Более простой альтернативой приведенному выше коду является следующее:

d = {'doc_441': {201: 1, 220: 1},
     'doc_577': {201: 1, 205: 1}}


def get_line(d):
    return ",".join('{}:{}'.format(nest_key, nest_token) for nest_key, nest_token in d.items())


# For Key, Token pair in dict
combined_file_content = '\n'.join("doc_({}).txt".format(key) + "," + get_line(token) for key, token in d.items())
print(combined_file_content)

Выход

doc_(doc_441).txt,201:1,220:1
doc_(doc_577).txt,201:1,205:1
0 голосов
/ 18 сентября 2018

Я надеюсь, что это то, что вы хотели, хотя это быстрый и грязный метод, он дает вывод, похожий на ваш пример

код для записи в файл

with open("text.txt", "w") as f:
    for k in d:
        f.write("doc_({}), {}\n".format(k,str(d[k])[1:-1]))

код для печати содержимого файла

with open("text.txt", "r") as f:
    print(f.read())

вывод кода

doc_(441), 201: 1, 220: 1, 232: 1, 23231: 4
doc_(4452), 203: 43, 2202: 45
0 голосов
/ 18 сентября 2018

Надеюсь, это то, что вы хотите:

lines = ""
for k, v in d.items():
    lines += "document_({})".format(k)
    for k2, v2 in v.items():
        lines = ", ".join([line, "{}:{}".format(k2,v2)])
    lines += "\n"
print(lines)

Тест:

Используя словарь ввода:

d = { '441' : {201:1, 220:1, 232:1, 23231:4},
  '4452' : {203:43, 2202: 45} }

, результат будет:

>>> document_(441), 201:1, 220:1, 232:1, 23231:4
>>> document_(4452), 203:43, 2202:45
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...