【问题标题】:Split a list in sublists by a logic criterion按逻辑标准拆分子列表中的列表
【发布时间】:2014-05-17 00:59:07
【问题描述】:

我有一个列表,其中每个元素可以是一个数字或两个不同字符串之一(我们称之为“a”和“b”)。我想将列表分成三个列表:数字列表、“a”列表和“b”列表。

我可以使用条件列表理解来做到这一点:

mixlist=[1,2,'a',3,'b','a']
numlist=[el for el in mixlist if type(el)==int]
alist=[el for el in mixlist if el=='a']
blist=[el for el in mixlist if el=='b']

但它会导致在 mixlist 上运行多次。可能我可以做得更好,但我不知道只有一次在 mixlist 上运行的捷径......

【问题讨论】:

    标签: python list-comprehension conditional-statements


    【解决方案1】:

    你可以直接做,像这样

    numlist, alist, blist = [], [], []
    for item in mixlist:
        if item == "a":
            alist.append(item)
        elif item == "b":
            blist.append(item)
        else:
            numlist.append(item)
    

    或者你可以把它缩短一点,像这样

    numlist, alist, blist = [], [], []
    d = {"a": alist, "b": blist}
    for item in mixlist:
        d.get(item, numlist).append(item)
    

    dict.get方法会返回key对应的值。但是当没有找到key时,它会返回作为第二个参数传递的默认值。因此,在我们的例子中,如果键是ab,我们将得到对应的alistblist。如果两者都不是,那么我们将得到 numlist 并将 item 添加到它。

    编辑:您可以像这样稍微改进直接的方式

    mixlist = [1, 2, 'a', 3, 'b', 'a']
    
    numlist, alist, blist = [], [], []
    nappend, aappend, bappend = numlist.append, alist.append, blist.append
    
    for item in mixlist:
        if item == "a":
            aappend(item)
        elif item == "b":
            bappend(item)
        else:
            nappend(item)
    

    【讨论】:

    • Nitpick: d.get(item, numlist) 为不是 'a'/'b' 的项目设置默认值 - 例如,'c' 将在那里结束,它不是一个数字(OPs 代码的东西不会这样做,因为它是隐式类型检查)...我会去声明 d = {'a': [], 'b': [], int: []} 并使用 d[int if instance(item, int) else item].append(item) 并在需要时从字典中解压缩列表...
    • 在完全理解“字典”解决方案后,我删除了第一条评论。那是因为它可以作为列表理解运行。
    • thefourtheye:更新中的nappend = numlist.append, aappend = alist.append, bappend = blist.append 行引发TypeError
    • thefourtheye:很好,看起来它现在可以实际工作了——尽管我认为nappend, aappend, bappend = numlist.append, alist.append, blist.append 会更好......
    • @martineau 是的,那会更好。现在用那个更新答案:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 2023-03-19
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    相关资源
    最近更新 更多