格式化字典打印输出

时间:2016-12-30 13:22:27

标签: python dictionary

我有一个名为d的词典,里面有几个列表。如果我打印字典,我会很难读出输出:

 {'Patch(0,8)': [28, 56, 75], 'Patch(0,6)': [1, 11, 17, 19, 20, 23, 28, 30, 44, 45, 49, 56, 60, 63, 75, 81, 91, 99], 
 'Patch(4,0)': [2, 5, 6, 8, 19, 22, 23, 27, 31, 34, 35, 36, 41, 45, 51, 52, 53, 55, 56, 59, 60, 61, 62, 64, 66, 67, 68, 70, 73, 75, 76, 77, 79, 85, 87, 91, 94, 96], 
 'Patch(4,6)': [19, 23, 45, 56, 60, 75, 91], 'Patch(0,0)': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 
  10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 
  57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], 'Patch(8,0)': [2, 22, 23, 27, 34, 52
 , 55, 60, 85], 'Patch(0,2)': [0, 1, 2, 3, 4, 6, 7, 10, 11, 13, 15, 16, 17, 18, 19, 20, 22, 23, 25, 26, 28, 29, 30, 32, 34, 36, 37, 38, 40, 43, 44, 45, 46, 47,
  49, 50, 51, 52, 53, 54, 56, 58, 59, 60, 61, 62, 63, 64, 66, 70, 71, 74, 75, 76, 77, 78, 80, 81, 83, 85, 90, 91, 92, 93, 94, 96, 98, 99], 'Patch(2,8)': [28, 56, 75], 'Patch(4,8)': [56, 75]}

我只想在新行中打印每个Patch和相应的数据:

 {'Patch(0,8)': [28, 56, 75], 
  'Patch(0,6)': [1, 11, 17, 19, 20, 23, 28, 30, 44, 45, 49, 56, 60, 63, 75, 81, 91, 99], 

在看到this answer :

中的建议后,我尝试了pprint
 pprint.pprint(d, width=1)

我明白了:

  {'Patch(0,8)': [28, 
                 56, 
                 75], and so on 

我在这里缺少什么?

3 个答案:

答案 0 :(得分:5)

只需传入足够大的宽度来保存struct CThread : LIST_ENTRY { HANDLE _hThread; ULONG _dwThreadId; CThread(HANDLE hThread, ULONG dwThreadId) { _hThread = hThread; _dwThreadId = dwThreadId; } ~CThread() { //CloseHandle(_hThread);// will be closed in ContinueDebugEvent } static CThread* get(ULONG dwThreadId, PLIST_ENTRY ThreadListHead, CThread* pHintThread) { if (pHintThread && pHintThread->_dwThreadId == dwThreadId) { return pHintThread; } PLIST_ENTRY entry = ThreadListHead; while ((entry = entry->Flink) != ThreadListHead) { pHintThread = static_cast<CThread*>(entry); if (pHintThread->_dwThreadId == dwThreadId) { return pHintThread; } } return 0;//?? } static void DeleteAll(PLIST_ENTRY ThreadListHead) { PLIST_ENTRY entry = ThreadListHead->Flink; while (entry != ThreadListHead) { CThread* pThread = static_cast<CThread*>(entry); entry = entry->Flink; delete pThread; } } }; void RunDebuggerLoop() { BOOL bQuit = FALSE; LIST_ENTRY ThreadListHead = { &ThreadListHead, &ThreadListHead }; CThread* pThread = 0; DEBUG_EVENT de; BOOLEAN bFirst = TRUE; while (!bQuit && WaitForDebugEvent(&de, INFINITE)) { NTSTATUS status = DBG_CONTINUE; switch(de.dwDebugEventCode) { case EXCEPTION_DEBUG_EVENT: if ( !de.u.Exception.dwFirstChance || !(pThread = CThread::get(de.dwThreadId, &ThreadListHead, pThread)) ) { bQuit = TRUE; continue; } status = DBG_EXCEPTION_NOT_HANDLED; switch (de.u.Exception.ExceptionRecord.ExceptionCode) { case STATUS_BREAKPOINT: case STATUS_WX86_BREAKPOINT: if (bFirst) { bFirst = FALSE; status = DBG_CONTINUE; } break; case STATUS_SINGLE_STEP: case STATUS_WX86_SINGLE_STEP: { ::CONTEXT ctx = {}; ctx.ContextFlags = CONTEXT_CONTROL; if (GetThreadContext(pThread->_hThread, &ctx)) { ctx.EFlags |= RESUME_FLAG; SetThreadContext(pThread->_hThread, &ctx); } } break; case STATUS_ACCESS_VIOLATION: if (de.u.Exception.ExceptionRecord.NumberParameters > 1) { ULONG_PTR ptr = de.u.Exception.ExceptionRecord.ExceptionInformation[1]; } break; } break; case CREATE_PROCESS_DEBUG_EVENT: CloseHandle(de.u.CreateProcessInfo.hFile); //CloseHandle(de.u.CreateProcessInfo.hProcess);// will be auto closed in ContinueDebugEvent de.u.CreateThread.hThread = de.u.CreateProcessInfo.hThread; case CREATE_THREAD_DEBUG_EVENT: if (pThread = new CThread(de.u.CreateThread.hThread, de.dwThreadId)) { InsertHeadList(&ThreadListHead, pThread); } break; case EXIT_THREAD_DEBUG_EVENT: if (pThread = CThread::get(de.dwThreadId, &ThreadListHead, pThread)) { RemoveEntryList(pThread); delete pThread; pThread = 0; } break; case LOAD_DLL_DEBUG_EVENT: CloseHandle(de.u.LoadDll.hFile); break; case EXIT_PROCESS_DEBUG_EVENT: bQuit = TRUE; break; case OUTPUT_DEBUG_STRING_EVENT: case UNLOAD_DLL_DEBUG_EVENT: __nop(); break; default: __nop(); } if (!ContinueDebugEvent(de.dwProcessId, de.dwThreadId, status)) { break; } } CThread::DeleteAll(&ThreadListHead); } void Ep() { // tag by * in begin of CommandLine PWSTR CommandLine = GetCommandLine(); if (!CommandLine || *CommandLine != '*') { // debugger case WCHAR FileName[MAX_PATH]; if (ULONG n = GetModuleFileName(0, FileName, RTL_NUMBER_OF(FileName))) { if (n < MAX_PATH) { PROCESS_INFORMATION pi; STARTUPINFO si = { sizeof(si) }; PWSTR newCommandLine = (PWSTR)alloca((wcslen(CommandLine) + 2)*sizeof(WCHAR)); *newCommandLine = '*'; wcscpy(newCommandLine + 1, CommandLine); if (CreateProcessW(FileName, newCommandLine, 0, 0, 0, DEBUG_PROCESS, 0, 0, &si, &pi)) { CloseHandle(pi.hThread); CloseHandle(pi.hProcess); RunDebuggerLoop(); } } } ExitProcess(0); } else { // main case wcscpy(CommandLine, CommandLine + 1); OutputDebugStringA("AAAAAA\n"); if (MessageBoxW(0, L"xxx", CommandLine, MB_YESNO) == IDYES) { OutputDebugStringW(L"WWWWWWWW\n"); } ExitProcess(0); } } 中的每个值:

dict

答案 1 :(得分:3)

我通常将dicts打印为JSON,以便为其提供易于阅读的结构和格式。

import json
json.dumps( dict( a=1, b=2), indent=2)

答案 2 :(得分:1)

你可以将它变成一个简单的循环来打印它。请查看dict.iteritems官方文档。

for key, value in d.iteritems():
    print key + " - " + str(value)