[英]split string into inner list without affecting relations
我有一個列表列表, lol
:
[ ['filiabus', 'filia +N +Abl +Sg', 'filia +N +Dat +Sg'],
['canēs', 'canis +N +Acc +Pl', 'canis +N +Abl +Pl'], ...]
每個內部列表都有 3 個元素,所有這些元素當前都是字符串。 我想要做的是用空格字符拆分第二個和第三個項目以創建如下內容:
[
['filiabus', ['filia', '+N', '+Abl', '+Sg'], ['filia', '+N', '+Dat', '+Sg'] ],
...
]
重要的是,這些新的嵌套列表是具有第一項的同一列表的一部分(例如filiabus
)。 如果它更容易,第一個元素可以是一個單獨的列表。
我覺得這樣的事情應該有效
test=[]
for i in lol:
for j in i:
test.append([j[0],j[1].split(' '), j[2].split(' ')])
但它只會產生:
>>> test
[['f', ['i'], ['l']], ['f', ['i'], ['l']], ['f', ['i'], ['l']], ['c', ['a'], ['n']], ['c', ['a'], ['n']], ['c', ['a'], ['n']]]
Thanks!
作為您的初始列表,包含 3 個長度的列表,您可以直接將它們解壓縮為 3 個變量,例如
for name, v1, v2 in values:
然后,結果只是第一個值,另外 2 個都被拆分(在“連續空格”上沒有分隔符拆分)
values = [['filiabus', 'filia +N +Abl +Sg', 'filia +N +Dat +Sg'],
['canēs', 'canis +N +Acc +Pl', 'canis +N +Abl +Pl']]
result = [[name, v1.split(), v2.split()] for name, v1, v2 in values]
print(result) # [['filiabus', ['filia', '+N', '+Abl', '+Sg'], ['filia', '+N', '+Dat', '+Sg']],
# ['canēs', ['canis', '+N', '+Acc', '+Pl'], ['canis', '+N', '+Abl', '+Pl']]]
對於任何大小的列表,您都可以這樣做:
lol = [['filiabus', 'filia +N +Abl +Sg', 'filia +N +Dat +Sg'],
['canēs', 'canis +N +Acc +Pl', 'canis +N +Abl +Pl']]
def transform(sublist):
first, *others = sublist
return [first, *(item.split() for item in others)]
out = [transform(sublist) for sublist in lol]
print(out)
# [['filiabus', ['filia', '+N', '+Abl', '+Sg'], ['filia', '+N', '+Dat', '+Sg']],
# ['canēs', ['canis', '+N', '+Acc', '+Pl'], ['canis', '+N', '+Abl', '+Pl']]]
我相信這就是你想要做的。
lol = [ ['filiabus', 'filia +N +Abl +Sg', 'filia +N +Dat +Sg'],
['canēs', 'canis +N +Acc +Pl', 'canis +N +Abl +Pl']]
# Iterate through each list in lol
for i in range(len(lol)):
# Iterate through each string in the list
for j in range(len(lol[i])):
# Only split if string contains a space
if " " in lol[i][j]:
# Reassign position
lol[i][j] = lol[i][j].split(" ")
print(lol)
# Prints
#[['filiabus', ['filia', '+N', '+Abl', '+Sg'], ['filia', '+N', '+Dat', '+Sg']],
#['canēs', ['canis', '+N', '+Acc', '+Pl'], ['canis', '+N', '+Abl', '+Pl']]]
要做的關鍵是,不是遍歷每個元素,而是遍歷每個元素的每個索引。 這允許您重新分配給元素的 position。
另外,請注意,當您在示例中嘗試訪問j[i]
時,您訪問的是每個字母,而不是每個單詞。 每個單詞都是i[x]
。
這個答案是更易讀的版本; 如需更短的列表理解版本,請查看 azro 的答案。
第二for
是多余的。 解釋:變量i
將循環遍歷lol
的列表,而變量j
將循環遍歷每個列表的單詞。
例如,在第一次迭代中,您將擁有:
i=['filiabus', 'filia +N +Abl +Sg', 'filia +N +Dat +Sg']
j='filiabus'
您現在可以看到j[0] = 'f'
和j[1] = 'i'
(所以j[1].split(' ') = ['i']
)。
解決方法:去掉內循環:
test = []
for i in lol:
test.append([i[0],i[1].split(' '), i[2].split(' ')])
或更優雅(和pythonic)的方式:
test = [[i[0], i[1].split(), i[2].split()] for i in lol]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.