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

Python 按逻辑条件将列表拆分为子列表,python,list-comprehension,conditional-statements,Python,List Comprehension,Conditional Statements,我有一个列表,其中每个元素可以是一个数字,也可以是两个不同字符串中的一个(我们称之为“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']

我有一个列表,其中每个元素可以是一个数字,也可以是两个不同字符串中的一个(我们称之为“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']

但它会导致在混音列表上运行多次。也许我可以做得更好,但我不知道一个简单的方法,只运行一次混音列表…

您可以直接这样做

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)
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)
或者你可以把它缩短一点,像这样

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)
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)
dict.get
方法将返回与键对应的值。但当找不到键时,它将返回作为第二个参数传递的默认值。因此,在我们的例子中,如果键是
a
b
,我们将得到相应的
alist
blist
。如果两者都不是,那么我们将获得
numlist
,并将
项添加到它

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

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)
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)

挑剔:
d.get(item,numlist)
为不是
'a'
/
'b'
-例如,
'c'
将在那里结束,它不是一个数字(OPs代码不会做这件事,因为它是隐式类型检查)。。。我会声明
d={'a':[]、'b':[]、int:[]}
并使用
d[int if instance(item,int)else item].append(item)
并在必要时从dict中解压缩列表……一旦我完全理解了“dictionary”解决方案,我就删除了第一条注释。这是因为它可以作为列表理解运行。thefourtheye:The
nappend=numlist.append,aappend=alist.append,bappend=blist.append更新中的
行引发了一个
TypeError
。thefourtheye:Good,看起来现在可以实际工作了,尽管我认为
nappend,aappend,bappend=numlist.append,alist.append,blist.append
会更好…@martineau-Yup,那会更好。现在更新答案:-)