我正在尝试在目录中拆分文件名字符串列表。文件是成对生成的。一个是原始的,第二个是修改的。因此,列表如下所示:
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'
谢谢。
答案 0 :(得分:3)
将list-comprehension
与str.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.groupby
和For 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