簡體   English   中英

將字符串拆分為內部列表而不影響關系

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM