【问题标题】:extract data using loop over tuple in python [duplicate]使用python中的元组循环提取数据[重复]
【发布时间】:2015-11-13 14:26:41
【问题描述】:

我有以下元组包含分子编号 (MolNum) 和来自某个参考点的对应 distance。分子按照distances升序排列。我可以将MolNumdistances 提取为两个单独的列表。但是,我想通过满足以下条件来获得 g 的元素 if 10 < distance < 100 ;所以我会得到gg。我怎么能得到这个?

g = [(MolNum(378), 2.4613922385709617e-14),
 (MolNum(373), 40.6680008439399),
 (MolNum(353), 72.49296570091882),
 (MolNum(354), 83.18203548933252),
 (MolNum(359), 88.23588863972836),
 (MolNum(372), 97.47433492265824),
 (MolNum(369), 104.59206739018573),
 (MolNum(370), 114.66573137439451),
 (MolNum(361), 122.33788252133775),
 (MolNum(376), 137.2686523522959),
 (MolNum(360), 141.72521396936926),
 (MolNum(371), 145.96842598002533),
 (MolNum(352), 149.8990795114449),
 (MolNum(366), 164.55606071030496),
 (MolNum(358), 180.72531479536423),
 (MolNum(375), 182.21612213617874),
 (MolNum(364), 185.78028496680486),
 (MolNum(363), 192.02220222384793),
 (MolNum(368), 194.0298647708072),
 (MolNum(365), 194.57037736733918),
 (MolNum(356), 201.91526815811372),
 (MolNum(362), 217.8580017023349),
 (MolNum(357), 234.3818585062885),
 (MolNum(374), 241.33751568809993),
 (MolNum(367), 249.36129229747306),
 (MolNum(355), 253.59625354913504)]

满足条件后;

gg = [(MolNum(373), 40.6680008439399),
 (MolNum(353), 72.49296570091882),
 (MolNum(354), 83.18203548933252),
 (MolNum(359), 88.23588863972836),
 (MolNum(372), 97.47433492265824)] 

【问题讨论】:

    标签: python python-2.7 python-3.x ipython


    【解决方案1】:
    gg = [(mol_num, distance) for mol_num, distance in g if 10 < distance < 100]
    

    【讨论】:

    • 很好,非常感谢。它有效!
    【解决方案2】:

    您可以为此使用builtin filter function,在第一个参数中将条件作为 lambda 表达式,在第二个参数中提供要过滤的列表 -

    gg = list(filter(lambda x: 10 < x[1] < 100,g))
    

    对于 Python 2.7,您不需要 list(...),因为过滤器会返回一个列表。


    在 Python 3.x 中,filter() 函数返回一个迭代器,它产生满足条件的元素(即条件返回 True

    在 Python 2.7 中,filter() 函数返回满足条件的元素列表(即条件返回 True


    示例/演示 -

    >>> class MolNum:
    ...     def __init__(self, n):
    ...             self.n = n
    ...
    >>> g = [(MolNum(378), 2.4613922385709617e-14),
    ...  (MolNum(373), 40.6680008439399),
    ...  (MolNum(353), 72.49296570091882),
    ...  (MolNum(354), 83.18203548933252),
    ...  (MolNum(359), 88.23588863972836),
    ...  (MolNum(372), 97.47433492265824),
    ...  (MolNum(369), 104.59206739018573),
    ...  (MolNum(370), 114.66573137439451),
    ...  (MolNum(361), 122.33788252133775),
    ...  (MolNum(376), 137.2686523522959),
    ...  (MolNum(360), 141.72521396936926),
    ...  (MolNum(371), 145.96842598002533),
    ...  (MolNum(352), 149.8990795114449),
    ...  (MolNum(366), 164.55606071030496),
    ...  (MolNum(358), 180.72531479536423),
    ...  (MolNum(375), 182.21612213617874),
    ...  (MolNum(364), 185.78028496680486),
    ...  (MolNum(363), 192.02220222384793),
    ...  (MolNum(368), 194.0298647708072),
    ...  (MolNum(365), 194.57037736733918),
    ...  (MolNum(356), 201.91526815811372),
    ...  (MolNum(362), 217.8580017023349),
    ...  (MolNum(357), 234.3818585062885),
    ...  (MolNum(374), 241.33751568809993),
    ...  (MolNum(367), 249.36129229747306),
    ...  (MolNum(355), 253.59625354913504)]
    >>>
    <filter object at 0x02302E70>
    >>> gg = list(filter(lambda x: 10 < x[1] < 100,g))
    >>> len(gg)
    5
    

    【讨论】:

    • 很高兴我们能提供帮助,我想请您接受一个答案,无论您觉得哪个最好,点击答案左侧的勾号,这会很有帮助为社区服务。
    【解决方案3】:

    你可以这样试试

    gg = [item for item in g if 10<item[1]<100]
    

    或者你可能会认为@Anand S Kumar 是使用filter() 的答案,这是一种更pythonic的方式。

    希望对你有帮助

    【讨论】:

    • 这也有效。谢谢!
    【解决方案4】:

    你可能想看看 Pandas,它是这种类型的表格数据分析非常常用的包:

    import pandas as pd
    g= pd.DataFrame(g)
    gg = g[g[1].between(10,100)] 
    gg
    
    Out[239]: 
         0          1
    1  373  40.668001
    2  353  72.492966
    3  354  83.182035
    4  359  88.235889
    5  372  97.474335
    

    【讨论】:

    • 感谢您的推荐。不过我没用熊猫。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 2010-12-27
    • 2018-07-28
    • 1970-01-01
    相关资源
    最近更新 更多