def only_evens(lst):
""" (list of list of int) -> list of list of int
Return a list of the lists in lst that contain only even integers.
>>> only_evens([[1, 2, 4], [4, 0, 6], [22, 4, 3], [2]])
[[4, 0, 6], [2]]
"""
even_lists = []
for sublist in lst:
for i in sublist:
if i % 2 == 0:
even_lists.append(i)
return even_lists
我无法做到这一点,因为它会将所有内容都返回到一个列表中[] 但是,如何返回仅包含整数的子列表?
答案 0 :(得分:5)
我会将它分成两个函数:一个检查列表是否只包含偶数,另一个是你的主函数(我将其重命名为get_even_lists()
),它从一个函数中获取所有偶数列表清单列表:
def only_even_elements(l):
""" (list of int) -> bool
Return a whether a list contains only even integers.
>>> only_even_elements([1, 2, 4]) # 1 is not even
False
"""
for e in l:
if e % 2 == 1:
return False
return True
def get_even_lists(lst):
""" (list of list of int) -> list of list of int
Return a list of the lists in lst that contain only even integers.
>>> only_evens([[1, 2, 4], [4, 0, 6], [22, 4, 3], [2]])
[[4, 0, 6], [2]]
"""
# return [l for l in lst if only_even_elements(l)]
even_lists = []
for sublist in lst:
if only_even_elements(sublist):
even_lists.append(sublist)
return even_lists
虽然这个可以3>完成for
/else
:
def get_even_lists(lst):
""" (list of list of int) -> list of list of int
Return a list of the lists in lst that contain only even integers.
>>> only_evens([[1, 2, 4], [4, 0, 6], [22, 4, 3], [2]])
[[4, 0, 6], [2]]
"""
even_lists = []
for sublist in lst:
for i in sublist:
if i % 2 == 1:
break
else:
even_lists.append(sublist)
return even_lists
或正如其他人所说的那样,单行:
def get_even_lists(lst):
""" (list of list of int) -> list of list of int
Return a list of the lists in lst that contain only even integers.
>>> only_evens([[1, 2, 4], [4, 0, 6], [22, 4, 3], [2]])
[[4, 0, 6], [2]]
"""
return [sublst for sublst in lst if all(i % 2 == 0 for i in sublst)]
但是我们在这里说实话:虽然可以说使用两个函数可能会比其他两个函数更长一些并且不像其他两个解决方案那样“酷”,它可以重用,易于阅读和理解,并且可以维护。我认为它比那里的任何其他选择要好得多。
答案 1 :(得分:1)
你也可以使用函数式编程来做到这一点:
is_odd = lambda n: n & 1
all_even = lambda arr: not any(map(is_odd, arr))
only_evens = lambda arr: filter(all_even, arr)
修改强>
根据J.F. Sebastian的建议,我将其分为三个部分:
is_odd
all_even
使用按位运算来检查数字是否为奇数以提高效率。 only_evens
检查列表是否包含所有偶数并返回布尔值。 op
获取整数列表的列表,并返回仅包含偶数整数的列表列表。
答案 2 :(得分:0)
我不会考虑你要保留什么,而是考虑你要删除的内容(包含奇数的所有列表)。像
这样的东西import copy
list_copy = copy.copy(lists)
def only_evens(list_copy):
for l in list_copy:
for i in l:
if i % 2 != 0:
list_copy.remove(l)
break
return(list_copy)
(强调可读性而不是简洁,当然。)
答案 3 :(得分:-1)
我想你可以将你的问题分成几个部分。
def contains_only_evens(lst):
return sum([x%2 for x in lst]) == 0
def only_evens(lst):
for sublist in lst:
if not contains_only_evens(sublist):
lst.remove(sublist)
return lst
通过这种方式你可以: