【问题标题】:Python list with filter function (excel-way)具有过滤功能的 Python 列表(excel 方式)
【发布时间】:2014-08-19 11:41:04
【问题描述】:

我有一个 Python 列表:

listx = [["a", 127, "Blue", 0],
         ["b", 127, "Red", 1],
         ["b", 127, "Green", 0],
         ["b", 99, "Green", 1],
         ["c", 99, "Yellow", 0]]

这是更好地了解情况的表格视图:

我想做一些过滤功能。例如;我想得到一个 index 0 = "b"index 1 = 127 的列表。所以结果一定是:

listxnew = [["b", 127, "Red", 1],
            ["b", 127, "Green", 0]]

listxnew 的表格视图以更好地了解情况:

那么我怎样才能用简单的 Python 代码做到这一点呢?谢谢。

【问题讨论】:

    标签: python list python-2.7 python-3.x filtering


    【解决方案1】:

    这是一个易于扩展的简单解决方案:

    def filterls(ls, opts):
        """
        ls - list
        opts - dict - {id: match_info}
        """
        results = []
        for l in ls:
            for (i, t) in opts.items():
                if l[i] != t:
                    break
            else:
                results.append(l)
        return results
    

    你的例子:

    listx = [["a", 127, "Blue", 0],
             ["b", 127, "Red", 1],
             ["b", 127, "Green", 0],
             ["b", 99, "Green", 1],
             ["c", 99, "Yellow", 0]]
    
    print filterls(listx, {0: 'b', 1: 127})
    # [['b', 127, 'Red', 1], ['b', 127, 'Green', 0]]
    

    【讨论】:

    • 我认为这仅适用于 Python 2.7。我用 Python 3.4 得到了这个:AttributeError: 'dict' object has no attribute 'viewitems'
    • @user3051668 - 是的,在 python 3.4 中,viewitems 只是项目。已编辑。
    【解决方案2】:
    listx = [["a", 127, "Blue", 0],
             ["b", 127, "Red", 1],
             ["b", 127, "Green", 0],
             ["b", 99, "Green", 1],
             ["c", 99, "Yellow", 0]]
    
    listnew = filter(lambda x: x[0]=='b' and x[1]==127,listx)
    
    print listnew
    

    尝试使用Filter

    【讨论】:

    • print listnew 给了我 ,我错过了什么吗?
    • @user3051668 不打印过滤列表
    • @sundarnatarajСундар OP 正在使用 Python 3.x,我认为。
    • @user3051668:只需输入list(listnew) 即可查看在 Python 3.x 下生成的过滤器。 +1 - 这是恕我直言的最佳方式
    【解决方案3】:

    您可以使用列表推导来做到这一点,如下所示:

    listxnew = [i for i in listx if i[0:2]==['b', 127]]
    
    >>> print listxnew
    [['b', 127, 'Red', 1]
     ['b', 127, 'Green', 0]]
    

    【讨论】:

    • 这不是我想要的方式。任何定义,函数或类似的东西?我将把它用于 GUI。因此,可以过滤的东西可能不止两个、三个或只有一个。
    • @user3051668,我不确定你的意思,但你可以很容易地从上面的代码中创建一个def。对不起
    • @user3051668 - 检查我的答案是否有效?我很好奇这是否是你要找的东西。
    • 它有效,但我不想为不同的过滤编写不同的代码。如果我想用索引 0 和索引 2 进行过滤,那将是不同的列表理解。
    • @user3051668 您可以轻松地将列表推导式放入一个函数中,并根据某些输入(例如您要检查的索引及其所需值)来获取它
    猜你喜欢
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多