将字符串拆分为内部列表而不影响关系

2024-06-28 18:46:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列表,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!

Tags: intest元素列表forsgcandat
3条回答

对于任何大小的列表,您都可以这样做:

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

由于初始列表包含3个长度的列表,您可以直接将它们解压缩到3个变量中,如

 for name, v1, v2 in values:

然后,结果就是第一个值,另外两个值都被拆分(在“连续空格”上没有分隔符拆分)

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

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

关键的事情是,不要迭代每个元素,而是迭代每个元素的每个索引。这允许您重新分配到元素的位置

另外,请注意,当您试图访问示例中的j[i]时,您正在访问每个字母,而不是每个单词。每个单词都是i[x]

这个答案更具可读性;对于一个简短的列表理解版本,请查看azro的答案

相关问题 更多 >