字符串列表,想要将它们分成两个列表

时间:2019-04-24 14:09:24

标签: python list list-comprehension

我正在尝试在目录中拆分文件名字符串列表。文件是成对生成的。一个是原始的,第二个是修改的。因此,列表如下所示:

files = ['data1', 'data2', 'data3', 'data1-m', 'data2-m', 'data3-m']

但是一切都变得混乱了。
我想创建两个列表,索引彼此对应,如下所示:

original_files = ['data1','data2','data3']
modified_files = ['data1-m','data2-m','data3-m']

目前,我有:

noised_files = [x for x in files if 'm' in x]
original_files = [x for x in files if not 'm' in x]

它确实拆分了列表,但不是成对的,我希望在其中:

>original_files[0] = 'data1'
>noised_files[0] = 'data1-m'

谢谢。

6 个答案:

答案 0 :(得分:3)

list-comprehensionstr.endswith()sorted()结合使用:

files = ['data3', 'data1', 'data2', 'data2-m', 'data3-m', 'data1-m']

files = sorted(files)
print([x for x in files if x.endswith('m')])
print([x for x in files if not x.endswith('m')])

编辑

也可以这样写:

noised_files = [x for x in files if x.endswith('m')]
original_files = [x for x in files if x not in noised_files]

print(original_files[0])                 # data1
print(noised_files[0])                   # data1-m

编辑2

使用filter()

print(list(filter(lambda x: x.endswith('m'), files)))
print(list(filter(lambda x: not x.endswith('m'), files)))

输出

['data1-m', 'data2-m', 'data3-m']
['data1', 'data2', 'data3']

答案 1 :(得分:2)

如果可以保证所有合作伙伴都在原始列表中,则可以“忽略” -m变体,然后将其“重新添加”到新列表中。

pairs = [(x, "{}-m".format(x)) for x in files if not x.endswith("-m")]

然后,您可以根据需要解压缩pairs以获得两个相应的列表:

original_files, modified_files = zip(*pairs)

这将保持原始文件的顺序,同时根据修改后的文件进行匹配。

答案 2 :(得分:1)

一种方法是使用itertools.groupbyFor Each ws In ThisWorkbook.Worksheets If ws.Name <> "Sheet1" And ws.Name <> concepts Then For w = 1 To ws.Name.Cells(1, Columns.Count).End(xlToLeft).Column If ws.Name.Cells(1, w).Value = create Then ws.Name & "c" = w ElseIf ws.Name.Cells(1, w).Value = delete Then ws.Name & "d" = w End If Next w EndIf Next 对列表中的字符串进行分组。这样,您可以确保两个列表中共享起始子字符串的元素具有匹配的索引:

zip

哪个给:

from itertools import groupby
l = [list(v) for _,v in groupby(sorted(files), key=lambda x: x.rstrip('-m'))]
original_files, noised_files= list(zip(*l))

答案 3 :(得分:0)

为什么一次迭代就需要两个列表推导。 我还将事先对列表进行排序,以处理加扰的列表,例如 ['data1', 'data3', 'data2-m', 'data1', 'data1-m', 'data3-m']

files = ['data1', 'data2', 'data3', 'data1-m', 'data2-m', 'data3-m']
noised_files = []
original_files = []

for file in sorted(files):
    if file.endswith('-m'):
        noised_files.append(file)
    else:
        original_files.append(file)
print(noised_files)
print(original_files)
#['data1-m', 'data2-m', 'data3-m']
#['data1', 'data2', 'data3']

答案 4 :(得分:0)

我认为使用正则表达式会更安全。您的文件名称中可能包含字母m,因此您正在寻找以-m结尾的文件。我推荐这样的东西:

import re

files = ['data1', 'data2', 'data3', 'data1-m', 'data2-m', 'data3-m']

original_files = []
modified_files = []

for file in files:
    if (re.search("-m$", file)):
        modified_files.append(file)
    else:
        original_files.append(file)

print(original_files, modified_files)

您可以在打印之前对列表进行排序,也可以编写更多代码进行比较。

答案 5 :(得分:0)

如果名称中表示已修改文件的部分始终在名称中的同一位置,则只需对获得的列表进行排序:

files = ['data1', 'data2', 'data3', 'data3-m', 'data1-m', 'data3-m']

# we could use list comprehensions, but this way, we only iterate once on files. 
original_files = []
modified_files = []
for f in files:  
    if f.endswith('-m'):
        modified_files.append(f)
    else:
        original_files.append(f)

original_files.sort()
modified_files.sort()

输出:

for i in range(len(original_files)):
    print(original_files[i], modified_files[i])

# data1 data1-m
# data2 data3-m
# data3 data3-m