如何从列表中只获取偶数

时间:2016-03-04 20:57:17

标签: python python-3.x

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

我无法做到这一点,因为它会将所有内容都返回到一个列表中[] 但是,如何返回仅包含整数的子列表?

4 个答案:

答案 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

虽然这个可以完成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

通过这种方式你可以:

  • 遍历列表及其子列表
  • 检查列表是否包含任何奇数
  • 仅保留没有赔率值的子列表