如何 return 匹配条件的列表子集
How to return a subset of a list that matches a condition
假设我有一个 int
列表:
listOfNumbers = range(100)
而我想要return一个满足特定条件的元素列表,比如说:
def meetsCondition(element):
return bool(element != 0 and element % 7 == 0)
return list
中 meetsCondition(element)
是 True
的子 list
元素的 Pythonic 方法是什么?
一种天真的方法:
def subList(inputList):
outputList = []
for element in inputList:
if meetsCondition(element):
outputList.append(element)
return outputList
divisibleBySeven = subList(listOfNumbers)
有没有一种简单的方法可以做到这一点,也许使用列表理解或 set()
函数,而不需要临时 outputList
?
使用列表理解,
divisibleBySeven = [num for num in inputList if num != 0 and num % 7 == 0]
或者您也可以使用 meetsCondition
,
divisibleBySeven = [num for num in inputList if meetsCondition(num)]
你实际上可以用 Python 的 truthy 语义编写相同的条件,像这样
divisibleBySeven = [num for num in inputList if num and num % 7]
或者,您可以将 filter
函数与 meetsCondition
一起使用,就像这样
divisibleBySeven = filter(meetsCondition, inputList)
%timeit
listOfNumbers = range(1000000)
%timeit [num for num in listOfNumbers if meetsCondition(num)]
[out]:
243 ms ± 4.51 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit list(filter(meetsCondition, listOfNumbers))
[out]:
211 ms ± 4.19 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
假设我有一个 int
列表:
listOfNumbers = range(100)
而我想要return一个满足特定条件的元素列表,比如说:
def meetsCondition(element):
return bool(element != 0 and element % 7 == 0)
return list
中 meetsCondition(element)
是 True
的子 list
元素的 Pythonic 方法是什么?
一种天真的方法:
def subList(inputList):
outputList = []
for element in inputList:
if meetsCondition(element):
outputList.append(element)
return outputList
divisibleBySeven = subList(listOfNumbers)
有没有一种简单的方法可以做到这一点,也许使用列表理解或 set()
函数,而不需要临时 outputList
?
使用列表理解,
divisibleBySeven = [num for num in inputList if num != 0 and num % 7 == 0]
或者您也可以使用 meetsCondition
,
divisibleBySeven = [num for num in inputList if meetsCondition(num)]
你实际上可以用 Python 的 truthy 语义编写相同的条件,像这样
divisibleBySeven = [num for num in inputList if num and num % 7]
或者,您可以将 filter
函数与 meetsCondition
一起使用,就像这样
divisibleBySeven = filter(meetsCondition, inputList)
%timeit
listOfNumbers = range(1000000)
%timeit [num for num in listOfNumbers if meetsCondition(num)]
[out]:
243 ms ± 4.51 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit list(filter(meetsCondition, listOfNumbers))
[out]:
211 ms ± 4.19 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)