如何循环访问顺序字符串值并追加到嵌套列表

How to iterate through sequential string values and append to a nested list

提问人:Brudalaxe 提问时间:6/28/2022 最后编辑:Brudalaxe 更新时间:6/28/2022 访问量:34

问:

我有一个包含数据集文件名的列表,以数字的形式后跟一些描述性文本(每个文件都不同):

a = ['001_sometext', '002_sometext', ..., '162_sometext', '001_sometext', ..., '162_sometext]

列表从多次循环到多次,但列表也没有遵循完美的顺序,缺少一些数字。'001''162'

我的目的是读取包含的所有文件并将它们附加到另一个列表中,然后对 和 执行相同的操作,这样我最终会得到一个嵌套列表,其中包含序列中每个数字的单独列表。'001''002'

我目前的尝试:

phrases = []
xi = []
for digits in range(0, 162):
    for x in a:
        if str(digits) in x:
            xi.append(x)
    phrases.append(xi)

但是,这给了我一个一遍又一遍的整个列表的嵌套列表,而不是每个数字的列表。

编辑:

上面的循环是读取所有只包含 的文件,这会带回数百个文件并将它们添加到列表中。一个小的修复是我为每个数量级制作了一个循环:'0'

phrases = []
for digits in range(1, 10):
    xi = []
    for x in a:
        if '00' + str(digits) in x:
            xi.append(x)
        else: None
    phrases.append(xi)

phrases = []
for digits in range(10, 100):
    xi = []
    for x in a:
        if '0' + str(digits) in x:
            xi.append(x)
        else: None
    phrases.append(xi)

phrases = []
for digits in range(100, 162):
    xi = []
    for x in a:
        if str(digits) in x:
            xi.append(x)
        else: None
    phrases.append(xi)
python 字符串列表 附加 嵌套列表

评论

1赞 Titouan L 6/28/2022
如果清除数字循环迭代之间的内容,则循环可能是正确的。xi
0赞 Brudalaxe 6/28/2022
@TitouanL我已经移动了 习 = [],所以它现在在数字 for 循环中,这在后面的数字中确实在一定程度上起作用。我认为主要问题是循环遍历“0”并添加到列表中,该列表将每个文件添加为“0”。我已经稍微纠正了这一点,我将在编辑中解释。
2赞 Titouan L 6/28/2022
是的,我用 准备了一个答案,但最终@Nick的答案是一样的,所以我想你可以使用他的解决方案。x.startswith(str(digits).rjust(3, '0'))f-string

答:

1赞 Nick 6/28/2022 #1

你的代码有一些问题,首先你需要清除每个循环;然后你需要在 1 到 163 的范围内迭代(即 1 到 162 包括 162),最后你不能使用 因为(例如)会匹配 、 等。xistr(digits) in xstr(1)001015102

像这样的东西应该可以工作:

for digits in range(1, 163):
    xi = []
    srch = f'{digits:03d}'
    for x in a:
        if x.startswith(srch):
            xi.append(x)
    phrases.append(xi)

或者,您可以使用嵌套列表推导式:

phrases = [ [f for f in a if f.startswith(f'{n:03d}')] for n in range(1, 163)]

如果

a = ['001_sometext', '002_sometext', '162_sometext', '001_someothertext', '162_someothertext']

这两者都给出了以下结果:

[['001_sometext', '001_someothertext'], ['002_sometext'], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], ['162_sometext', '162_someothertext']]