如何用pythonic方式将元组分成两个

raf*_*elc 5 python tuples list-comprehension python-2.7

我遇到了一个问题:收到一个包含任何类型对象的元组,并将其分成两个元组:第一个,只有字符串; 第二个,只有数字.

好的.标准算法类似于:

def separate(input_tuple):
    return_tuple = ([],[])
    for value in input_tuple:
        if isinstance(value, str):
            return_tuple[0].append(value)
        if isinstance(value, numbers.Number):
            return_tuple[1].append(value)
    return tuple([tuple(l) for l in return_tuple])
Run Code Online (Sandbox Code Playgroud)

这样,我们只迭代一次.

我的问题是:有没有办法以更加pythonic的方式做到这一点?单线?

我试过了

( tuple([i for i in input_tuple if isinstance(i,str)]), tuple([i for i in input_tuple if isinstance(i,numbers.Number)]))
Run Code Online (Sandbox Code Playgroud)

但它效率较低,因为我们两次迭代输入元组.

也,

tuple([ tuple( [i for i in input_tuple if isinstance(i, k)]) for k in ((float ,int,complex), str) ])
Run Code Online (Sandbox Code Playgroud)

有同样的问题,因为我们做了两次迭代.这是可能只迭代一次仍然得到结果,或者因为我正在处理分离成两个元组,这是不可能的?

谢谢!

Jor*_*ley 3

我想你可以做类似的事情

my_tuple = ([],[])
for x in a_list:
   my_tuple[isinstance(x,basestring)].append(x) 
Run Code Online (Sandbox Code Playgroud)

我想这会让它变得更加Python化......并且仍然具有很好的可读性。

当然,您也可以将其放入列表理解中,但这不是一个很好的选择:

[my_tuple[isinstance(x,basestring)].append(x) for x in a_list]
Run Code Online (Sandbox Code Playgroud)

列表理解就被扔掉了,它基本上被滥用到 for 循环中。