【问题标题】:Python list issuePython列表问题
【发布时间】:2011-12-16 07:56:32
【问题描述】:

我需要一些提示或示例,如何在列表a 中本地化列表b,然后将其替换为列表c

a=[1,3,6,2,6,7,3,4,5,6,6,7,8]

输入b 列表(这是程序在列表a 中搜索的子列表)。

b=[6,7]

当找到返回我的索引是子列表已经找到并每次用c=[0,0]替换它,所以结果将是

[1,3,6,2,0,0,3,4,5,6,0,0,8]

【问题讨论】:

    标签: python list search indexing return


    【解决方案1】:

    这是比我的第一个更有效的方法,使用列表切片:

    >>> for i in xrange(len(a) - len(b) + 1):
    ...     if a[i:i+len(b)] == b:
    ...         a[i:i+len(b)] = c
    ... 
    >>> a
    [1, 3, 6, 2, 0, 0, 3, 4, 5, 6, 0, 0, 8]
    

    第一次尝试,为了后代......

    如果您不需要中间索引,这是一种方法,使用字符串函数并采用函数式方法,而不是就地修改列表。

    >>> a_as_str = ','.join(str(i) for i in a)
    >>> print a_as_str
    1,3,6,2,6,7,3,4,5,6,6,7,8
    >>> b_as_str = ','.join(str(i) for i in b)
    >>> b_as_str
    '6,7'
    >>> c_as_str = ','.join(str(i) for i in c)
    >>> c_as_str
    '0,0'
    >>> replaced = a_as_str.replace(b_as_str, c_as_str)
    >>> replaced
    '1,3,6,2,0,0,3,4,5,6,0,0,8'
    >>> [int(i) for i in replaced.split(',')]
    [1, 3, 6, 2, 0, 0, 3, 4, 5, 6, 0, 0, 8]
    

    这可以重构为:

    >>> def as_str(l):
    ...     return ','.join(str(i) for i in l)
    ... 
    >>> def as_list_of_ints(s):
    ...     return [int(i) for i in s.split(',')]
    ... 
    >>> as_list_of_ints(as_str(a).replace(as_str(b), as_str(c)))
    [1, 3, 6, 2, 0, 0, 3, 4, 5, 6, 0, 0, 8]
    

    【讨论】:

    • 从整数到字符串再转换回来对我来说比直接搜索列表要清楚得多。这也有显着的性能损失(尽管在这种情况下可能不相关)。
    • 这是超级可读和高效的,但这里有一个问题:替换正在就地完成,而步长可能(可能)小于替换大小。这有点棘手,因为您可能希望进行第一次有效替换。
    • @amicitas:谢谢。我不确定这是不是一个问题,因为替换 [0, 0] 和搜索 [6, 7] 没有重叠。
    【解决方案2】:

    你可以做类似的事情(用python 3.2编写,在python 2.x中使用xrange):

    for i in range(0, len(a)):
        if a[i:i+len(b)] == b:
            a[i:i+len(b)] = c
    

    这将包含所有大小的列表。 这假设 list b == list c 我不知道这是否是您想要的,但是,如果不是,请说明。

    列表的输出:

    a = [1,2,3,4,5,6,7,8,9,0]
    b = [1,2]
    c = [0,0]
    Output:
    [0, 0, 3, 4, 5, 6, 7, 8, 9, 0]
    

    【讨论】:

    • 哦,哇,我什至没有看到列表 b,我将编辑答案。编辑:完成
    • 对于问题中提供的a, b, c 的给定值,现在返回a 作为[1, 3, 0, 0, 0, 0, 3, 4, 5, 6, 0, 0, 8]
    • 感谢您,在修复对齐错误时我造成了另一个错误,for 循环只测试了第一个值,现在我得到了您发布的解决方案 =d
    • 解决了!我知道这一点是因为它现在和我的一样,只是你循环了一个索引。
    【解决方案3】:

    我举个例子

    li=[1,3,6,2,6,7,3,4,5,6,6,7,8]
    for i  in range(len(li)): 
        if li[i:i + 2] == [3, 4]: 
            li[i:i + 2] = [0, 0]
    

    我认为这段代码应该可以工作。如果您想要更健壮的脚本,我建议您检查原始列表中子字符串的出现情况并编辑副本(以避免副作用行为)。

    【讨论】:

    • 一些改进:使用op使用的变量名,可以使范围像range(len(a) - len(b));如果if a[i:i+len(b)] == b;作业a[i:i+len(b)] = c.
    【解决方案4】:

    考虑当给定模式由替换创建时会发生什么也很重要。

    我认为这个函数应该按预期处理所有情况:

    def replace(a, b, c):
        ii = 0
        while ii <= (len(a) - len(b) + 1):
            print(ii)
            if a[ii:ii+len(b)] == b:
                a[ii:ii+len(b)] = c
                ii += len(b)
            else:
                ii += 1
        return a
    


    使用原始示例的输出:

    [1, 3, 6, 2, 0, 0, 3, 4, 5, 6, 0, 0, 8]
    


    以下是替换创建搜索模式的示例:

    a = [1,1,1,1,1,1,1,1,1,6,6,7,7,1]
    b = [6,7]
    c = [0,6]
    

    输出如预期:

    [1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 0, 6, 7, 1]
    



    关于如何更简洁地做到这一点的任何想法?

    【讨论】:

      猜你喜欢
      • 2012-03-11
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 2020-09-29
      • 2013-01-07
      • 2013-09-04
      • 2011-01-11
      • 2010-12-29
      相关资源
      最近更新 更多