作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个列表,其中每个元素可以是数字或两个不同字符串之一(我们称之为“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)
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)
关于python - 按逻辑标准将列表拆分为子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22867439/
我是一名优秀的程序员,十分优秀!