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