有没有办法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]
通过使用切片表示法或您可以建议的任何其他简单方法。
使用列表推导:
>>> 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]
>>> 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]
使用方法和排除列表
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]
给定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)]
这是一个函数,它接受多个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']
如果您传入无序或重叠的切片,它将无法正常工作。
它还一次创建整个列表。一个更好(但更复杂)的解决方案是创建一个迭代器类,它只迭代您希望包含的项目。这里的解决方案对于相对较短的列表来说已经足够好了。
我想知道使用它是否也有效:
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
print my_list[:3] + my_list[7:]