按逻辑条件将列表拆分为子列表

1 投票
1 回答
679 浏览
提问于 2025-04-18 01:22

我有一个列表,里面的每个元素可以是一个数字,或者是两个不同的字符串(我们称它们为'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']

但是这样做会多次遍历这个混合列表。可能我可以找到更好的方法,但我不知道有没有更简短的方法能只遍历一次这个混合列表...

1 个回答

2

你可以直接这样做

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 方法会返回和你给的键对应的值。如果找不到这个键,它会返回你作为第二个参数传入的默认值。所以在我们的例子中,如果键是 a 或者 b,我们就会得到对应的 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)

撰写回答