根据值类型将列表拆分为字典

时间:2016-12-15 10:19:11

标签: python regex python-2.7

我有一个包含一个单词后跟多个数字的列表。有些人用逗号分隔我的空格。我正在尝试将单词作为字典中的键,然后将每个数字拆分为单独的列表,并将其存储为字典值。

输入:

my_list = ['word 1234 123 1', 'word 123 43 564', 'somethingelse 123,4124,56', etc...]

输出:

my_dict = {'word': ['1234', '123', '1'],
     'word': ['123', '43', '564'], 'somethingelse': '123', '4124', '56' ]}

到目前为止,我已尝试创建要删除的单词以及不同的正则表达式:

re.sub(r'([^\s\w]|_)+', '', str(my_list))

stopwords = ['word']
querywords = my_list.split()
resultwords = [word for word in querywords if word.lower() not in stopwords]
result = ' '.join(resultwords)

re.findall('\d+|\D+', my_list)

我在某些词之前写了这个方法来分割:

def removeBeforeX(self, x, listIn, listOut):
        for item in listIn:
            if x in item:
                a,b = item.split(x)
                listOut.append(b)
            else:
                listOut.append(item)
        return listOut

我不一定需要这个词作为键,因为键在词典中必须是唯一的,但我确实需要将这些词分开但将它们放在一个列表中。

2 个答案:

答案 0 :(得分:1)

有什么问题?

>>> import re
>>> my_dict={}
>>> my_list = ['word1 1234 123 1', 'word2 123 43 564', 'somethingelse 123,4124,56']
>>> for i in my_list:
...     parts = re.split(r'[, ]', i)
...     my_dict[parts[0]] = parts[1:]
...
>>> my_dict
{'word2': ['123', '43', '564'], 'somethingelse': ['123', '4124', '56'], 'word1': ['1234', '123', '1']}

显然,你不能两次使用相同的密钥,否则会覆盖该值。

没有re模块的方法:

>>> for i in my_list:
...     parts = i.replace(',', ' ').split()
...     my_dict[parts[0]] = parts[1:]
...

答案 1 :(得分:1)

EDITED

输出字典

我会使用分区方法将字符串与re和findall结合起来

import re

my_dict = {}
my_list = ['wordA 1234 123 1', 'wordB 123 43 564', 'somethingelse 123,4124,56']

for item in my_list:
    my_dict[item.partition(' ')[0]] = re.findall('\d+', item)

print my_dict

以上代码将生成以下字典

{'wordA': ['1234', '123', '1'], 'wordB': ['123', '43', '564'], 'somethingelse': ['123', '4124', '56']}

IF 您希望多次使用相同的单词,您需要重写循环以检查密钥是否存在,并将新值附加到现有列表中。

输出一份清单

如果不需要字典,我会使用re和list comprehension

my_newlist = [re.findall('\d+', item) for item in my_list]

print my_newlist

上面的代码导致以下列表列表

[['1234', '123', '1'], ['123', '43', '564'], ['123', '4124', '56']]