按逻辑条件将列表拆分为子列表
我有一个列表,里面的每个元素可以是一个数字,或者是两个不同的字符串(我们称它们为'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
,我们就会得到对应的 alist
或 blist
。如果都没有找到,那就会得到 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)