我正在寻找一种从元组元组中获取字符串列表的不同方法。这就是我现在的做法:
x = (('a',1), (2,3), (4,), (), (None,))
op_list = []
for item in x:
if item and item[0]:
op_list.append(str(item[0]))
print op_list
输出:['a','2','4']
我想不出任何其他方式来到列表。我的问题是,有没有更好的/替代的/漂亮的方式呢?
编辑:在输入中添加了一些陷阱输入,如空元组,带有None的元组以及给定的预期输出。还编辑了这个问题,以确保我只需要一个字符串列表,而不管除None之外的任何其他数据类型。
答案 0 :(得分:3)
>>> x = (('a',1), (2,3), (4,))
>>> [str(item[0]) for item in x if item and item[0]]
['a', '2', '4']
答案 1 :(得分:2)
使用map
和lambda
函数可以为您提供最简单,最紧凑的方法:
>>> x = (('a',1), (2,3), (4,), (None,), ())
>>> filter(None, map(lambda i: str(i[0]) if len(i) > 0 and i[0] != None else None, x))
['a', '2', '4']
答案 2 :(得分:1)
使用itemgetter
。
from operator import itemgetter
f = itemgetter(0)
def func(i):
if not i:
return None
r = f(i)
if r:
return str(r)
使用它:
>>> x = (('a',1), (2,3), (4,), None, '', False, [], (None,), ())
>>> filter(None, map(func, x))
['a', '2', '4']
你可以把它变成一个功能:
def extract_first_non_none(collection):
return filter(None, map(func, collection))
或者上课:
class Extractor():
def __init__(self, index):
self.getter = itemgetter(index)
def _func(self, item):
if not item:
return None
r = self.getter(item)
if r != None:
return str(r)
def extract(self, collection):
return filter(None, map(self._func, collection))
使用课程:
>>> x = (('a',1), (2,3), (4,), None, '', False, [], (None,), ())
>>> e = Extractor(0)
>>> e.extract(x)
['a', '2', '4']