从字典列表的字典中提取元素

时间:2015-04-15 05:49:52

标签: python

我有一个这种格式的词典列表字典(是的,预期'元素中没有逗号)。

mydict = {
    'labyrinth': [
        {
            u'content': u'something',
            u'expected': u''
        },
        {
            u'content': u'somethingelse',
            u'expected': u'thistext\n   user ID: a.b.c\n      user ID: e.f.g\n'
        },
        {
            u'content': u'blah',
            u'expected': u'a. Path:somepath\n   user ID: b.c.d\n'
        }
    ]
}

我必须从上面的迷宫中提取所有用户ID。

我尝试了一些解决方法来最小化数据:

anodict=mydict['labyrinth'][1].copy() #Just the second dictionary from the list for example
print anodict['expected']

给我这个unicode字符串:

u'a. Path:somepath\n   user ID: b.c.d\n

我再次不确定如何从这种奇怪的格式中单独提取用户ID。 如何在上面的dicts列表中仅过滤包含用户ID的词典,以及如何在单独的词典列表中单独提取用户ID及其值? 请帮忙。

3 个答案:

答案 0 :(得分:1)

上面的示例数据语法不正确。

所以这是我的更新:

mydict = {
    'labyrinth': [
        {
            u'content': u'something',
            u'expected': u''
        },
        {
            u'content': u'somethingelse',
            u'expected': u'thistext\n   user ID: a.b.c\n      user ID: e.f.g\n'
        },
        {
            u'content': u'blah',
            u'expected': u'a. Path:somepath\n   user ID: b.c.d\n'
        }
    ]
}

从列表索引中获取任何dict对象。例如:2

>>> anodict=mydict['labyrinth'][2]

现在导入re以匹配字符串

中的ID
>>> import re
>>> anodict
{u'content': u'blah', u'expected': u'a. Path:somepath\n   user ID: b.c.d\n'}
>>> re.search(r'ID\:\s([\w\.]+)', anodict['expected']).group(1)
u'b.c.d'

此处u'b.c.d'是您想要的结果。

我希望这会对你有所帮助。

答案 1 :(得分:1)

上一个答案不一定会在一行中找到多个ID。

您可以使用re.findall从字符串

中提取多个ID
import re
ids = []
for dict_ in mydict["labyrinth"]:
    ids.extend(re.findall(r"ID: (\w\.\w.\w)", dict_["expected"]))

答案 2 :(得分:1)

你的问题是:

  

...如何单独提取用户ID及其值   dicts列表?

这是一些非正则代码,它实际上会生成所需的词典列表:

mydict = {'labyrinth': [{u'content': u'something', u'expected': u''},
                        {u'content': u'somethingelse', u'expected': u'thistext\n   user ID: a.b.c\n      user ID: e.f.g\n'},
                        {u'content': u'blah', u'expected': u'a. Path:somepath\n   user ID: b.c.d\n'}]}

ids = []
for d in mydict['labyrinth']:
    expected = d.get('expected', '').split()
    ids.extend([{'user_id': expected[i+1]} for i, s in enumerate(expected) if s == 'ID:'])

print ids

<强>输出

[{'user_id': u'a.b.c'}, {'user_id': u'e.f.g'}, {'user_id': u'b.c.d'}]

上面是一个稍微严格的版本:

ids = []
for d in mydict['labyrinth']:
    expected = d.get('expected', '').split()
    for i, s in enumerate(expected):
        if s == 'ID:':
            ids.append({'user_id:': expected[i+1]})

print ids