按逻辑标准拆分子列表中的列表

时间:2014-04-04 15:51:16

标签: python list-comprehension conditional-statements

我有一个列表,其中每个元素可以是两个不同字符串中的数字或一个(让我们调用' a''')。我想将列表分成三个列表:数字列表,' 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上运行它的简短方法......

1 个答案:

答案 0 :(得分: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方法将返回与该键对应的值。但是当找不到密钥时,它将返回作为第二个参数传递的默认值。因此,在我们的情况下,如果密钥为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)