python:解压缩列表和集合

时间:2018-07-13 09:26:15

标签: regex python-2.7

我写了一个必须解压缩列表的代码,我是说

  

[无,[1,({2,3},{'foo':'bar'})]]

进入

  

[无,1、2、3,'foo','bar']

实际上,这是我的解决方案:

    import re
def unpack(l):
    pattern = r"\w+"
    fin = []
    for i in l:
        match = re.findall(pattern, i)
        fin.append(match)
    return fin

但这会导致问题 TypeError:预期的字符串或缓冲区,是的,我已经浏览了其他类似的问题。请告诉我正确的方法

正则表达式准确地选择了我需要的enter image description here

1 个答案:

答案 0 :(得分:2)

您不能将正则表达式应用于列表。您可以使用str将列表转换成字符串,然后然后应用正则表达式,但是您可能不应该。 *)

Intead,我建议使用一个递归函数来展平列表,并迭代任何嵌套字典中的键和值,并将其递归应用于任何嵌套列表,集合,元组或字典。

def unpack(seq):
    if isinstance(seq, (list, tuple, set)):
        yield from (x for y in seq for x in unpack(y))
    elif isinstance(seq, dict):
        yield from (x for item in seq.items() for y in item for x in unpack(y))
    else:
        yield seq

lst = [None, [1, ({2, 3}, {'foo': 'bar'})]]
print(list(unpack(lst)))
# [None, 1, 2, 3, 'foo', 'bar']

更新:对于Python 2.x,将yield from (...)替换为for x in (...): yield x,或者直接将return列表替换为yield元素不使用生成器:

def unpack(seq):
    if isinstance(seq, (list, tuple, set)):
        return [x for y in seq for x in unpack(y)]
    elif isinstance(seq, dict):
        return [x for item in seq.items() for y in item for x in unpack(y)]
    else:
        return [seq]

*)既然您问过:如果数字包含点或字符串包含...怎么办?另外,您还必须从匹配的字符串中以正确的类型(例如int)重新创建实际的对象。而且,如果列表中包含字符串或数字以外的对象,而这些对象无法轻松地通过其字符串表示形式重新创建,该怎么办?