Python:将带分隔符字符串的输入文件读入一个嵌套字典,并循环遍历i

2024-10-02 16:33:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我的输入文件如下所示:

1111;A:aaaa,B:aaaa,F:aaaa  
2222;A:aaaa,B:aaaa,E:aaaa  
3333;C:aaaa,D:aaaa,E:aaaa,F:aaaa  
4444;D:aaaa  
5555;C:bbbb  
2222;A:bbbb,B:bbbb  
2222;A:cccc,B:cccc  
1111;C:cccc,D:cccc,E:cccc,F:cccc  
2222;A:dddd,B:dddd  
1111;A:eeee,B:eeee  
1111;A:ffff,B:ffff  
2222;C:ffff,E:ffff,F:ffff  
1111;A:gggg,B:gggg,C:gggg  
3333;C:gggg,E:gggg,F:gggg  
5555;A:hhhh,B:hhhh

我想在java中得到一些类似的东西,比如在内部映射结构中使用字符串列表的嵌套映射。你知道吗

Map<'String, Map<'String, List{String}>>

像这样:

<1111:
      <'A':{'aaaa','eeee','ffff','gggg'}>
      <'B':{'aaaa','eeee','ffff','gggg'}>
      <'C':{'cccc','gggg'}>
      <'D':{'cccc'}>
      <'E':{'cccc'}>
      <'F':{'aaaa','cccc'}>
>

Tags: 文件字符串map列表stringjava结构cccc
1条回答
网友
1楼 · 发布于 2024-10-02 16:33:05

Python的Java Map等价物是^{},用^{}可以很容易地解析这样一个简单的输入。你知道吗

我能想到的最简单的方法是:

nested_dict = dict()

for line in file:
    key, val = line.split(';')
    if key not in nested_dict:
        nested_dict[key] = dict()
    for part in val.split(','):
        key2, val2 = part.split(':')
        if key2 not in nested_dict[key]:
            nested_dict[key][key2] = []
        nested_dict[key][key2].append(val2)

您可以省略使用defaultdictif语句,以使其更好一些。你知道吗

from collections import defaultdict
nested_dict = defaultdict(lambda: defaultdict(list))

for line in file:
    key, val = line.split(';')
    for part in val.split(','):
        key2, val2 = part.split(':')
        nested_dict[key][key2].append(val2)

备注:在这些示例中,甚至数字键都存储为字符串。这可能是需要的,但如果不是,您可以在指定dict值时使用int将它们转换为整数。你知道吗

更新

要迭代嵌套字典的“leafs”,可以使用valuess的dict方法,该方法返回字典值的迭代器:

for dct in nested_dict.values():
    for val in dct.values():
        do_something(val)

在python2.7及以下版本中,建议在values上使用itervalues方法,因为它返回的是迭代器而不是列表。你知道吗

此外,还可以编写一个简单的生成器来循环这些值。你知道吗

def leafgen(nested_dict):
    for dct in nested_dict.values():
        for val in dct.values():
            yield val

那你就可以了

for val in leafgen(nested_dict):
    do_something(val)

你可以免费获得一些内置函数,例如

['aaaa'] in leafgen(nested_dict)

相关问题 更多 >