在两个索引之间迭代连接字符串 python

joining strings iteratively between two indexes python

我有一个格式如下的测试文件:

one
two
three
four
=
five
six
seven
eight
=
nine
ten
one
two
=

我正在编写一个 python 代码来创建一个列表,文本中的每个元素都是列表中的一个项目:

dump = sys.argv[1]
lines = []
with open(dump) as f:
    for line in f:
        x = line.strip()
        lines.append(x)
print(lines)

行列表=

['one', 'two', 'three', 'four', '=', 'five', 'six', 'seven', 'eight', '=', 'nine', 'ten', 'one', 'two', '=']

然后我得到等号的索引,以便稍后尝试使用它们来创建一个新列表,组合字符串:

equals_indexes = [i for i, x in enumerate(lines) if x == '=']

equals_indexes 列表:

[4, 9, 14]

到目前为止我都很好。现在我想在第一个索引之前加入字符串一、二、三、四作为 new_list 元素 1。我想加入等号 1 和 2 之间的下一组字符串,以及下一组等号 2 和 3 之间的字符串生成以下内容:

[[one two three four], [five six seven eight], [nine ten one two]]

我尝试通过遍历等于索引列表,然后遍历列表行来做到这一点:

for i in equals_indexes:
    sequences = ""
    for x,y in enumerate(lines):
        if x < i:
            sequences = ' '.join(lines[x:i])
            groups.append(sequences)
print(groups)

产生以下内容:

['one two three four', 'two three four', 'three four', 'four', 'one two three four = five six seven eight', 'two three four = five six seven eight', ....]

我明白为什么会这样,因为在 x 的每次迭代中,它都会检查它是否小于 i,如果是,则将 x 处的每个字符串附加到字符串 "sequences"。我这样做是因为我有一个大文件,其中包含与程序的一次迭代相对应的大量文本块。程序的第 1 次迭代和第 2 次迭代之间的分隔符是行中的单个“=”。这样我就可以在用等号拆分列表元素后解析它们。 任何帮助都会很棒!

这是一个空闲的小例子:

>>> stuff = ['a', 'b', 'c', '=', 'd', 'e', '=', 'f', 'g']
>>> "".join(stuff).split('=')
['abc', 'de', 'fg']

它将所有字符连接在一起(因此您可以跳过将它们分成单独列表的步骤),然后在 = 字符处拆分该字符串。

我认为这可以满足您的需求,尽管有一部分不清楚。如果您想将等号之间的字符串作为最终列表中的每个元素加入:

with open(dump) as f:
    full_string = ' '.join([line.strip() for line in f])
    my_list = [string.strip() for string in full_string.split('=') if string is not '']
print(my_list)

['one two three four', 'five six seven eight', 'nine ten one two']

如果您想要包含等号之间每个字符串的子列表,只需将上面的 my_list 替换为:

my_list = [[s for s in string.split()] for string in full_string.split('=') if string is not '']

[['one', 'two', 'three', 'four'], ['five', 'six', 'seven', 'eight'], ['nine', 'ten', 'one', 'two']]

奖金,他们使用列表推导式,这是一种更像 Python 的循环方式:

读入行直到你点击=,将它们合并为一个监听并添加它,继续直到完成,将最后一行列表内容放入:

t = """one
two
three
four
=
five
six
seven
eight
=
nine
ten
one
two
="""

data = [] # global list
line = [] # temp list
for n in [x.strip() for x in t.splitlines()]:
    if n == "=": 
        if line:
            data.append(' '.join(line))
        line = []
    else:
        line.append(n)

if line:
    data.append(' '.join(line))

print(data)

输出:

 ['one two three four', 'five six seven eight', 'nine ten one two']