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

Python 如何将不同索引处出现的字符串相乘,python,list,Python,List,我正在努力编写一个函数,将列表中的第一个字符串复制到6个位置,并将偶数索引中出现的字符串复制到两个位置,如果它出现在三的倍数,则复制三次。但是,如果它同时出现在偶数索引和三的倍数索引上,则应将其复制到六个位置。以下是我编写的代码,但似乎不是在我更改输入并针对更多情况时动态解决的,因为我遇到了以下错误: IndexError: list index out of range def multiply_strings(test): test[0] *= 6 test[2] *=

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

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']
还有其他与我已经发布的类似的边缘情况。

您可以使用该函数迭代列表的索引/值对。然后,只需应用您的逻辑来更新适当的值,例如:

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']
只是一些单行线

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

这怎么会产生错误呢?哪个错误?这两个列表中都有7个以上的项,它必须起作用。为什么您要将test[8]乘以8而不是2?您真的需要修改给定的列表并返回它吗?这很不寻常。test_list=[A,B,C,D,E,F,G]可以简化为test_list=listABCDEFG