我在python中有一个巨大的列表,如下所示:
('foo','bar','foo/bar','foo1','bar/1')
上面的每个值都演示了列表包含的字符种类 - aplhanumeric加斜杠。我需要一种方法将该列表转换为元组列表,如下所示:
(('foo','foo'),('bar','bar'),('foo/bar','foo/bar'),('foo1','foo1'),('bar/1','bar/1'))
那么有什么比正则表达式搜索和替换更好的方法,对吧? (如果我错了,请纠正我。)
因此,我试图匹配引号之间的任何内容,除了逗号之外,因为从技术上讲,它们也在引号之间。我使用lookahead和lookbehind来匹配任何东西:
(?<=')(.*?)(?=')
但这只匹配引号和逗号中的值。我需要的是匹配除逗号之外的值加引号,并使用替换正则表达式使列表看起来像上面的元组。
我无法手动执行此操作,因为列表很大。
有什么想法吗?
答案 0 :(得分:2)
好的,你有一个巨大的list
字符串。您需要一个tuple
,list
的每个元素都有(element, element)
对。
这正是zip
所做的,除了它在2.x中返回list
个这样的对,或者在3.x中返回迭代器。无论哪种方式,您只需拨打tuple
即可将其转换为tuple
。所以:
tuple(zip(huge_list, huge_list))
更一般地说,如果要逐个元素转换序列元素,可以使用理解或生成器表达式。没有“元组理解”,但只是将生成器表达式传递给tuple
函数也可以做同样的事情。所以:
tuple((element, element) for element in huge_list)
或者,如果您想要tuple
个(s[0], s[1:])
对,而不是(s, s)
对:
tuple((element[0], element[1:]) for element in huge_list)
等等。
与此同时,我无法想到将对象转换为repr
以对其运行正则表达式转换并重新解析它的任何情况都是Python中的一个好主意。这不仅仅是"Now they have two problems"问题;解析结果字符串(并且,即使你不关心安全性,弄清楚如何处理eval(repr(x)) != x
)将会比你开始时更难的问题。所以,如果你发现自己试图做到这一点,那就退后一步。