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)
有同样的问题,因为我们做了两次迭代.这是可能只迭代一次仍然得到结果,或者因为我正在处理分离成两个元组,这是不可能的?
谢谢!
我想你可以做类似的事情
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 循环中。