Thursday, May 5, 2011

List a dictionary

In a list appending is possible. But how I achieve appending in dictionary?

    Symbols from __ctype_tab.o:
Name                  Value   Class        Type         Size     Line  Section
__ctype             |00000000|   D  |            OBJECT|00000004|     |.data
__ctype_tab         |00000000|   r  |            OBJECT|00000101|     |.rodata

Symbols from _ashldi3.o:
Name                  Value   Class        Type         Size     Line  Section
__ashldi3           |00000000|   T  |              FUNC|00000050|     |.text

Symbols from _ashrdi3.o:
Name                  Value   Class        Type         Size     Line  Section
__ashrdi3           |00000000|   T  |              FUNC|00000058|     |.text

Symbols from _fixdfdi.o:
Name                  Value   Class        Type         Size     Line  Section
__fixdfdi           |00000000|   T  |              FUNC|0000004c|     |.text
__fixunsdfdi        |        |   U  |            NOTYPE|        |     |*UND*

How can I create a dictionary like:

dictOfTables {'__ctype_tab.o':{'__ctype': Name:...,Value:...,Class:...,Type:...,Size:...,Line:...,Section:...}} etc.

for the above text?

From stackoverflow
  • Look into using an ordered dictionary. I don't think this is in official Python yet, but there's a reference implementation available in the PEP.

  • Appending doesn't make sense to the concept of dictionary in the same way as for list. Instead, it's more sensible to speak in terms of inserting and removing key/values, as there's no "end" to append to - the dict is unordered.

    From your desired output, it looks like you want to have a dict of dicts of dicts, (ie {filename : { symbol : { key:value }}. I think you can get this from your input with something like this:

    import re
    
    header_re = re.compile('Symbols from (.*):')
    
    def read_syms(f):
        """Read list of symbols from provided iterator and return dict of values"""
        d = {}
        headings=None
        for line in f:
            line = line.strip()
            if not line: return d  # Finished.
    
            if headings is None:
                 headings = [x.strip() for x in line.split()]
                 continue # First line is headings
    
            items = [x.strip() for x in line.split("|")]
            d[items[0]] = dict(zip(headings[1:], items[1:]))
        return d
    
    f=open('input.txt')
    d={}
    for line in f:
        m=header_re.match(line)
        if m:
            d[m.group(1)] = read_syms(f)
    
    flight : The final dict would look like this: {'_ashrdi3.o': {'__ashrdi3': {'Section': '.text', 'Value': '00000000', 'Line': '', 'Type': 'FUNC', 'Class': 'T', 'Size': '00000058'}}, '_ashldi3.o': {'__ashldi3': {'Section': '.text', 'Value': '00000000', 'Line': '', 'Type': 'FUNC', 'Class': 'T', 'Size': '00000050'}}, '_fixdfdi.o': {'__fixdfdi': {'Section': '.text', 'Value': '00000000', 'Line': '', 'Type': 'FUNC', 'Class': 'T', 'Size': '0000004c'}, '__fixunsdfdi': {'Section': '*UND*', 'Value': '', 'Line': '', 'Type': 'NOTYPE', 'Class': 'U', 'Size': ''}}}

0 comments:

Post a Comment