4

タプルのタプルから文字列リストを取得する別の方法を探しています。これが私が今やっている方法です:

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 以外のデータ型に関係なく、文字列のリストのみが必要になるようにしました。

4

3 に答える 3

3
>>> x = (('a',1), (2,3), (4,))
>>> [str(item[0]) for item in x if item and item[0]]
['a', '2', '4']
于 2013-06-26T10:56:59.103 に答える
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']
于 2013-06-26T10:57:26.910 に答える
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']
于 2013-06-26T12:01:10.330 に答える