2013-10-22 31 views
0

有没有更好的方法来做到这一点?Python:从列表中提取浮动的优雅方式?

我有形式的“双重”的文章:

rlist = [([-0.5753647], [1.3716470]), ([-0.57536478], [0.75418190]), ([-1.37632438], [0.57068748])] 

从中我要提取单个的浮点数,格式化。

目前我使用的是:

first_number = round(float(str(rlist[0][0]).strip('[]')),4) 

例如,得到的第一个数字。这相当丑陋。有没有更简洁的方式来做到这一点(在Python中)?

DN

回答

2

你可以尝试这样的事情:

from itertools import chain 
[round(x, 4) for x in chain(*chain(*rlist))] 

itertools.chain可以用来压平嵌套iterables。之后,您可以使用列表理解和round获得所需精度的数字列表。

1

如果您选择了itertools.chain(),如果嵌套的级别是@更加please see the comments below this answer zero323

和圆形()也有一些限制太多,

f = -0.5753647 

print f 

-0.57536469999999995 

print round(f, 4) 

-0.57540000000000002 

所以,

rlist = [([-0.5753647], [1.3716470]), 
    ([-0.57536478], [0.75418190]), 
    ([-1.37632438], [0.57068748])] 

def flatten(container): 

    for i in container: 
     if isinstance(i, list) or isinstance(i, tuple): 
      for j in flatten(i): 
       yield j 
     else: 
      yield i 

print ["{0:.4f}".format(ele) for ele in list(flatten(rlist))] 
+0

1.检查这个'从随机导入随机;列表(chain(* chain(* [[[[random()] [in range(2)] for y in range(3)] for z in range(4)]))))''你可以尝试更深的嵌套,你会看到它工作正常。 2.转换为字符串不能解决问题,并且输出的结果与@dcnicholls不同。如果fp表达式确实是一个问题,那么可以使用'decimal.Decimal' 3.通常不鼓励使用'isinstance'。 'hasattr(i,“__iter __”)'可能是更好的解决方案。 – zero323

+0

您在评论中提到的建议非常复杂且难以理解,** chain()**方法在另一个中被称为一个,如果您不知道嵌套级别,该怎么办? –

+0

恕我直言,嵌套功能没有任何复杂的,但它可能是品味的问题。关于不知道嵌套。在这个问题的背景下,它并不重要,因为格式是固定的。但一般来说递归在这种情况下可能是危险的。没有提到这比'chain'慢得多。尝试运行这个:'从随机导入randint; foo = [[[[randint(1,10)] for x in range(1)] for y in range(1000)] for z in range(1000)]; %timeit list(chain(* chain(* chain(* foo)))); %timeit list(flatten(foo))'你会看到。 – zero323

相关问题