比较列表元素和套在Python
问题描述:
首先,我会告诉我的代码,然后我会解释:比较列表元素和套在Python
for eachfile in matches:
if eachfile in set1:
print 'find one match'
shutil.copy2(eachfile, '/Users/r2-d2/Desktop/folder')
print 'copy done'
matches
是像这样的列表:
[fooFILE_Aspam.txt, barFILE_B.CSV, codeFILE_Cdog.vcf]
set1
是一组像看起来像这样:
(FILE_A, FILE_B, FILE_F...)
我遍历列表来检查是否内eac h条目有该集合的任何元素。如果是这样,我将条目复制掉。 在上面的示例场景中,我希望匹配FILE_A
和FILE_B
。 我知道关键字in
会以其他方式工作,但我找不到一个优雅的解决方案,而不使用另一个循环。
答
怎么样在集合之间的交集?然后你复制结果?如果列表中的元素与集合中的元素是“相同的”,那么如果你正在寻找一个字符串中的数学,那么你真的不确定吗?
答
SET1不是一套(如你所说),但一个元组,所以你需要转换,然后你可以使用一组交叉点在两个
matching_files = list(set(matches).intersection(set(set1)))
for file in matching_files:
# Do your copy
pass
答
有很多方法可以做到这一点过滤重复。
import re
pat = re.compile('|'.join(set1))
for match in matches:
if pat.search(match):
# do stuff
但我可能会用正则表达式(或可能fnmatch
)的帮助下引进的过滤器,同时计算matches
答
使用any
检查,如果任何匹配eachfile。
matches = ['fooFILE_Aspam.txt', 'barFILE_B.CSV', 'codeFILE_Cdog.vcf']
set1 = ('FILE_A', 'FILE_B', 'FILE_F')
for eachfile in matches:
if any([x in eachfile for x in set1]):
print eachfile
答
首先,in
操作适用于set
和str
。在前一种情况下,您正在检查确切的字符串匹配;第二,包含连续的子串。我认为你是后者,所以这应该工作。
matches = ['fooFILE_Aspam.txt', 'barFILE_B.CSV', 'codeFILE_Cdog.vcf']
set1 = {'FILE_A', 'FILE_B', 'FILE_F'}
to_move = [fname for fname in matches if any(t in fname for t in set1)]
# In [39]: q.to_move
# Out[39]: ['fooFILE_Aspam.txt', 'barFILE_B.CSV']
答
您可以使用此:
for eachfile in [x for x in matches if x in set1]:
print 'find one match'
shutil.copy2(eachfile, '/Users/r2-d2/Desktop/folder')
print 'copy done'
或者说,它里面的for循环 - 列表:
def shCopy(file,dest='/Users/r2-d2/Desktop/folder'):
print 'find one match'
shutil.copy2(file, dest)
print 'copy done'
[shCopy(x) for x in matches if x in set1]
在名单内的这些字符串/设置? – 2016-05-12 14:08:53