说我有26个元素的列表,每个元素的字母如下:
alphabets = ['a', 'b', ... , 'y', 'z']
我的目标是每5个元素进行迭代连接,产生:
combined_strings = ['abcde', 'bcdef', ... 'vwxyz']
我尝试过:
combined_strings = []
for i, k in enumerate(alphabets):
temp_string = k[i] + k[i+1] + k[i+2] + k[i+3] + k[i+4]
combined_strings.append(temp_string)
但我遇到IndexError: List index out of range
答案 0 :(得分:1)
您以错误的方式使用enumerate
。 enumerate
给出索引和该索引处的元素,因此k[i]
没有任何意义。
另外,遍历整个长度会导致IndexError
,因为您将访问不存在的27、28、29、30处的元素。
您可以将代码更正为:
combined_strings = []
for i in range(len(alphabets)-4):
temp_string = alphabets[i] + alphabets[i+1] + alphabets[i+2] + alphabets[i+3] + alphabets[i+4]
combined_strings.append(temp_string)
答案 1 :(得分:0)
为此目的,使用字符串比使用列表更方便,因为您可以对字符串进行切片以提取子字符串。您也可以从ascii_lowercase
模块导入string
,而不必自己写出来。
>>> from string import ascii_lowercase as alphabet
>>> [ alphabet[i:i+5] for i in range(len(alphabet) - 4) ]
['abcde', 'bcdef', 'cdefg', 'defgh', 'efghi', 'fghij', 'ghijk', 'hijkl',
'ijklm', 'jklmn', 'klmno', 'lmnop', 'mnopq', 'nopqr', 'opqrs', 'pqrst',
'qrstu', 'rstuv', 'stuvw', 'tuvwx', 'uvwxy', 'vwxyz']
请注意,范围应增加到len(alphabet) - 4
(不包括),以使最后一个子字符串的全长为5。
答案 2 :(得分:0)
您在列表中的位置太远了,您的i会一直到i = 26,然后您没有27、28、29或30个字母
您可以执行以下操作:
get_listcol = function(..., d, list_col, join_cols = names(list(...)), mult = FALSE){
d[list(...), on=join_cols, nomatch=0, {
if (.N == 0L){
stop("No matches found.")
} else if (.N == 1L){
.SD[[1]][[1]]
} else {
if (mult){
.SD[[1]]
} else {
stop("Multiple matches found.")
}
}
}, .SDcols=list_col]
}
# usage
get_a2 = function(ii, jj) get_listcol(i = ii, j = jj, d = dt, list_col = "a")
get_a2(1,1) # works as expected
get_a2(1,4) # error
get_a2(1,1:2) # error
答案 3 :(得分:0)
尝试以下操作。
import string
li = list(string.ascii_lowercase);
liRes = []
for i in range(0,22):
liRes.append("".join(li[i:i+5]))
print(liRes)