Python 我可以使用切片方法返回一个列表,排除原始列表中间的范围吗? 有一种方法可以通过一个完整的列表来“代码>切片\代码”,同时排除列表中的一系列值或多个值范围吗? 例如: list = [1,2,3,4,5,6,7,8,9,0] print list[......] #some code inside

Python 我可以使用切片方法返回一个列表,排除原始列表中间的范围吗? 有一种方法可以通过一个完整的列表来“代码>切片\代码”,同时排除列表中的一系列值或多个值范围吗? 例如: list = [1,2,3,4,5,6,7,8,9,0] print list[......] #some code inside,python,list,range,slice,Python,List,Range,Slice,我希望上面的代码打印列表,同时排除一个值范围,这样输出将是:[1,2,3,8,9,0],或者排除多个值范围,这样输出将是:[1,2,6,7,0],使用切片表示法或您可以建议的任何其他简单方法 >>> 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] 另

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

>>> 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]

使用列表理解:

>>> 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]
顺便说一下,给列表命名不是一个好的做法。它已经是一个内置函数/类型


如果列表未排序且为字符串列表,则可以使用
map()
sorted()


使用方法和排除列表

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]

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

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

这样,如果你有列表<代码> [01,1,31,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']

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


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

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


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

my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
print my_list[:3] + my_list[7:]

排除的标准是什么?请不要使用
list
作为变量名-它隐藏了内置函数。看起来相当随意。是什么阻止你浏览列表,只是跳过你不感兴趣的索引?@aqua你能给我举个例子吗?@Sukritkalla为了这个问题,没有一个。我只是在寻找一些执行此任务的方法。虽然代码是正确的,但粘贴的输出是错误的。:)这并不是排除一系列索引,而是排除了一个avlue列表。@sukritkalla啊,对不起,这是一些测试错误。修正:)@Blubber这不是他想要的吗?“我希望上面的代码打印列表,同时排除一系列值”What if
mylist=[“a”、“b”、“c”、“d”、“e”、“f”、“g”、“h”、“I”、“j”]
mylist=[2,7,4,9,8,3,1]
换句话说,如果列表中的元素是无序的或字符串呢?我喜欢你的方法允许不同的范围,但是如果列表
l=[“a”、“b”、“c”、“d”、“e”、“f”、“g”、“h”、“I”、“j”]
l=[2,7,4,9,8,3,1]呢
换句话说,如果列表中的元素是无序的或是字符串呢?@Moolla列表的顺序和内容都无关紧要,只要它们可以相互比较以确保相等。如果
nums=[“a”、“b”、“c”、“d”、“e”、“f”、“g”、“h”、“i”、“j”]
nums=[2,7,4,9,8,3,1]呢
换句话说,如果列表中的元素是无序的或是字符串,该怎么办?啊,是的,我以前没有尝试过,被
set
函数抛出。因此,如果我希望排除字符串,我应该创建一个包含我要排除的字符串的单独列表,然后在分配给
exclude
set()
函数中传递该列表。或者我把它弄得更复杂了?你可以像第二个例子中的
[1]+range(0,2)
那样连接你想显示的项目,它适用于字符串列表等等,这是一个问题而不是答案。请使用另一种措辞来表示建议,该建议也应得到证实。请不要以使答案看起来像问题的方式书写答案。有适当的系统来检查非答案(NAA)帖子。这个答案被他们中的一个错误地接受了。请考虑编辑它看起来更像一个答案。重新表述“为什么不使用?”
[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:]