我写了一个必须解压缩列表的代码,我是说
[无,[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:预期的字符串或缓冲区,是的,我已经浏览了其他类似的问题。请告诉我正确的方法
答案 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
)重新创建实际的对象。而且,如果列表中包含字符串或数字以外的对象,而这些对象无法轻松地通过其字符串表示形式重新创建,该怎么办?