在排除列表中间的一个值范围或多个值范围的同时,是否有方法通过整个列表访问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]
我的示例使用带int的范围。但这种方法可以是任何项目列表,也可以是任何数量的与其他项目的排除列表,只要这些项目具有相等的比较即可。
编辑:一种更快的方法:
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()
和range()
(或Python 2.x中的xrange()
(:
[n for i, n in enumerate(my_list) if i not in range(3, 7)]
我想知道使用这个是否也有效:
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
print my_list[:3] + my_list[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'
和'Joey'
,从而产生['Amy', 'John', 'Melissa', 'Steve']
如果传入的切片顺序不正确或重叠,它将无法正常工作。
它还同时创建整个列表。一个更好(但更复杂(的解决方案是创建一个迭代器类,该类只对您希望包含的项进行迭代。这里的解决方案对于相对较短的列表来说已经足够好了。