返回列表或字符串直到第一次出现该对象

时间:2016-10-21 01:46:44

标签: python

我必须编写一个获取列表(或字符串)和对象的函数,并返回列表的副本,但不包括该对象的第一次出现,或者如果该对象不在名单。

我知道我必须在这里使用循环,但我感到困惑的是列表和字符串使用不同的方法来查找该对象的索引。我如何在循环中使用它来使我的函数到达该对象的第一次出现。

def up_to_first(item, element):
    if type(item) == list:
        index_of_element = item.index(element)
        res = [ ]
        for i in range(0, index_of_element):
            sliced_list = item[0 : index_of_element]

    return sliced_list

2 个答案:

答案 0 :(得分:1)

尝试以下功能:

def up_to_first(seq, obj):
    if obj not in seq:
        return seq
    return seq[:seq.index(obj)]

如果seq不在该序列中,则会返回sequence obj,并且会返回序列,但不包括obj。但是,如果你不小心类型,这个功能会破坏。例如,如果您在5中查找[1, 2, 3, 4, 5](并返回[1, 2, 3, 4]),它将起作用,但如果您在字符串中查找5,则会引发错误。

>>> up_to_first([1, 2, 3], 3)
[1, 2]
>>> up_to_first('abcdef', 'd')
'abc'
>>> up_to_first([1, 2, 3], 'a')
[1, 2, 3]
>>> up_to_first('abcdef', 1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/.../.../test.py", line 2, in up_to_first
    if obj not in seq:
TypeError: 'in <string>' requires string as left operand, not int

答案 1 :(得分:1)

考虑itertools已有此功能:

def seq_upto(seq, obj):
    return itertools.takewhile(lambda el: el is not obj, iter(seq))

我不清楚你是否想要匹配一个对象的身份或它的相等性(如在__eq__运算符中),但在上面的lambda I&#39中; m使用身份。

>>> import itertools
>>> def seq_upto(seq, obj):
...     return itertools.takewhile(lambda el: el is not obj, iter(seq))
...
>>> class foo(object):
...     pass
...
>>> y=seq_upto([0,1,2,3,4,foo,4,3,2], foo)
>>> list(y)
[0, 1, 2, 3, 4]
>>> y=seq_upto(range(5), foo)
>>> list(y)
[0, 1, 2, 3, 4]