繁体   English   中英

如何将出现在不同索引处的字符串相乘python

[英]How to multiply string that occur at different indices python

我正在努力编写一个函数,该函数将列表中的第一个字符串复制到6个位置,并将偶数索引处的字符串复制到2个位置,如果它出现在3的倍数的索引上,则重复3次。 但是,如果它同时出现在偶数索引和三倍的索引处,则应将其复制到六个位置。 这是我编写的代码,但是一旦更改输入并针对更多情况我似乎不会动态地解决它,则出现此错误:

IndexError: list index out of range


def multiply_strings(test):
    test[0] *= 6
    test[2] *= 2
    test[3] *= 3
    test[4] *= 2
    test[6] *= 6
    test[8] *= 8

    return test
test_list = ["A", "B", "C", "D", "E", "F", "G"]
print(multiply_strings(test_list))

此打印

IndexError: list index out of range

这不是所需的输出。

期待它打印

['AAAAAA', 'B', 'CC', 'DDD', 'EE', 'F', 'GGGGGG']

但预计会处理其他情况,例如

["A", "B", "C", "D", "E", "F", "G", "H", "I"]

这将打印。

['AAAAAA', 'B', 'CC', 'DDD', 'EE', 'F', 'GGGGGG', 'H', 'II']

还有其他一些与我已经发布的类似的极端案例。

只是一些班轮...

>>> a = ["A", "B", "C", "D", "E", "F", "G"]

>>> [(6, 1, 2, 3, 2, 1)[i % 6] * s for i, s in enumerate(a)]
['AAAAAA', 'B', 'CC', 'DDD', 'EE', 'F', 'GGGGGG']

>>> [(1 if i % 2 else 2) * (1 if i % 3 else 3) * s for i, s in enumerate(a)]
['AAAAAA', 'B', 'CC', 'DDD', 'EE', 'F', 'GGGGGG']

>>> [(bool(i % 2) or 2) * (bool(i % 3) or 3) * s for i, s in enumerate(a)]
['AAAAAA', 'B', 'CC', 'DDD', 'EE', 'F', 'GGGGGG']

有点烦人的是第一个是最短的。 我更喜欢其他人。 我发现因子2为(2 - i % 2) ,但是因子3没什么短的...

编辑:另一个简短的:

>>> [(min(i % 6, -i % 6) or 6) * s for i, s in enumerate(a)]
['AAAAAA', 'B', 'CC', 'DDD', 'EE', 'F', 'GGGGGG']

您可以使用enumerate()函数迭代列表的索引/值对。 然后只需应用您的逻辑就地更新值,例如:

def multiply_strings(strings):
    for i, s in enumerate(strings):
        k = 1
        if i % 2 == 0:
            k *= 2
        if i % 3 == 0:
            k *= 3
        strings[i] = s*k

strings =  ["A", "B", "C", "D", "E", "F", "G"]    
multiply_strings(strings)
print(strings)  # ['AAAAAA', 'B', 'CC', 'DDD', 'EE', 'F', 'GGGGGG']

下面的解决方案与上面的发布者非常相似,但是测试了列表开头的长度和循环条件中的细微差别。 无论您要做什么,都可以工作。

def multiply_strings(test):
    if len(test) > 0:
        test[0] *= 6
        for i in range(1, len(test)):
            k = 1
            if i % 2 == 0:
                k *= 2
            if i % 3 == 0:
                k *= 3
            test[i] *= k
    return test

>>>test_list = ["A", "B", "C", "D", "E", "F", "G", "H", "I"]
>>>print(multiply_strings(test_list))
['AAAAAA', 'B', 'CC', 'DDD', 'EE', 'F', 'GGGGGG', 'H', 'II']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM