【发布时间】:2015-07-10 20:01:57
【问题描述】:
我遇到了一个问题:接收一个包含任何类型对象的元组,并将其分成两个元组:第一个,仅包含字符串;第二个,只有数字。
好的。标准算法类似于:
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])
这样,我们只迭代一次。
我的问题是:有没有办法以更蟒蛇的方式来做?单线?
我试过了
( tuple([i for i in input_tuple if isinstance(i,str)]), tuple([i for i in input_tuple if isinstance(i,numbers.Number)]))
但它的效率较低,因为我们对输入元组进行了两次迭代。
还有,
tuple([ tuple( [i for i in input_tuple if isinstance(i, k)]) for k in ((float ,int,complex), str) ])
有同样的问题,因为我们做了两次迭代。 是否有可能只迭代一次并且仍然得到结果,或者因为我正在处理分成两个元组,这是不可能的?
谢谢!
【问题讨论】:
-
不要采用“pythonic 方式”,这是一个没有用处的陷阱,而且几乎总是将一段相当易读且易于理解的代码简化为 1-line-decoder-ring-需要混乱。您的目标应该是将代码格式化为易于维护和阅读的格式,而不是尽可能少的行。
-
@TymoteuszPaul 我知道这一点。我实际上并没有使用该代码,但在考虑列表理解时我感到有限,而且我最近一直在研究它;堆栈溢出的人总是用他们的答案给我留下深刻印象,所以这就是为什么我想知道这是否可能!不过谢谢你的建议!毕竟,“显式胜于隐式”!
-
在 Java 中,我们亲切地称之为进程拆分!拆分器ftw。
-
虽然“pythonic”有点旁观者的眼光,但我认为做两个单独的列表推导是可读的、可维护的并且不会影响算法的复杂性,因此实际上是相当 Pythonic。结果通常会让您在速度方面感到惊讶,因此我建议您计时。
-
为什么这么多人似乎认为“Pythonic”的意思是“尽可能聪明”或“尽可能短”?在判断 Pythonic 的程度时,可读性可能是最重要的一个品质。如果你让你的代码不那么可读,那么你也让它不那么 Pythonic。是的,关于什么是“可读”的意见不同。但可读性绝对是 Pythonic 理想中的一个目标,而简洁和聪明则不是。
标签: python python-2.7 tuples list-comprehension