5

有没有办法slice通过整个列表同时排除列表中间的一系列值或多个值范围?
例如:

list = [1,2,3,4,5,6,7,8,9,0]
print list[......] #some code inside  

我希望上面的代码在排除一系列值的同时打印列表,因此输出将是:[1,2,3,8,9,0]或排除多个值范围,因此输出将是:[1,2,6,7,0]通过使用切片表示法或您可以建议的任何其他简单方法。

4

6 回答 6

3

使用列表推导:

>>> mylist = [1,2,3,4,5,6,7,8,9,0]
>>> print [i for i in mylist if i not in xrange(4,8)]
[1, 2, 3, 8, 9, 0]

或者,如果您想排除两个不同范围内的数字:

>>> print [i for i in mylist if i not in xrange(4,8) and i not in xrange(1,3)]
[3, 8, 9, 0]

顺便说一句,命名列表并不是一个好习惯list。它已经是一个内置函数/类型。


如果列表是无序的并且是字符串列表,则可以map()与 一起使用sorted()

>>> mylist = ["2", "5", "3", "9", "7", "8", "1", "6", "4"]
>>> print [i for i in sorted(map(int,mylist)) if i not in xrange(4,8)]
[1, 2, 3, 8, 9]
于 2013-05-26T10:34:59.190 回答
2
>>> nums = [1,2,3,4,5,6,7,8,9,0]
>>> exclude = set(range(4, 8))
>>> [n for n in nums if n not in exclude]
[1, 2, 3, 8, 9, 0]

另一个例子

>>> exclude = set(range(4, 8) + [1] + range(0, 2))
>>> [n for n in nums if n not in exclude]
[2, 3, 8, 9]
于 2013-05-26T10:34:31.377 回答
1

使用方法和排除列表

def method(l, exclude):
    return [i for i in l if not any(i in x for x in exclude)]

r = method(range(100), [range(5,10), range(20,50)])
print r

>>> 
[0, 1, 2, 3, 4, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]

我的示例使用带整数的范围。但是此方法可以是任何项目列表,与其他项目具有任意数量的排除列表,只要项目具有相等比较即可。


编辑:更快的方法:

def method2(l, exclude):
    ''' 
    l is a list of items, exclude is a list of items, or a list of a list of items
    exclude the items in exclude from the items in l and return them.
    '''
    if exclude and isinstance(exclude[0], (list, set)):
        x = set()
        map(x.add, [i for j in exclude for i in j])
    else:
        x = set(exclude)
    return [i for i in l if i not in x]
于 2013-05-26T10:36:22.777 回答
1

给定my_list = [1,2,3,4,5,6,7,8,9,0],在一行中,使用enumerate()and range()(或xrange()在 Python 2.x 中):

[n for i, n in enumerate(my_list) if i not in range(3, 7)]
于 2016-05-25T17:44:55.447 回答
0

这是一个函数,它接受多个slice对象并为您提供一个仅包含这些切片包含的项目的列表。您可以通过指定要排除的内容来排除项目​​。

from itertools import chain
def sliceAndDice(sequence, *slices):
    return list(chain(*[sequence[slice] for slice in slices]))

所以,如果你有列表[0,1,2,3,4,5,6,7,8,9]并且你想排除4,5,6中间的,你可以这样做:

sliceAndDice([0,1,2,3,4,5,6,7,8,9], slice(0,4), slice(7,None))

这将返回[0, 1, 2, 3, 7, 8, 9]

它适用于不是数字的事物列表:sliceAndDice(['Amy','John','Matt','Joey','Melissa','Steve'], slice(0,2), slice(4,None))将省略'Matt'and 'Joey',导致['Amy', 'John', 'Melissa', 'Steve']

如果您传入无序或重叠的切片,它将无法正常工作。

它还一次创建整个列表。一个更好(但更复杂)的解决方案是创建一个迭代器类,它只迭代您希望包含的项目。这里的解决方案对于相对较短的列表来说已经足够好了。

于 2014-06-10T03:16:51.530 回答
0

我想知道使用它是否也有效:

my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
print my_list[:3] + my_list[7:]
于 2020-11-11T12:20:05.563 回答