比较列表元素和套在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_AFILE_B。 我知道关键字in会以其他方式工作,但我找不到一个优雅的解决方案,而不使用另一个循环。

+0

在名单内的这些字符串/设置? – 2016-05-12 14:08:53

怎么样在集合之间的交集?然后你复制结果?如果列表中的元素与集合中的元素是“相同的”,那么如果你正在寻找一个字符串中的数学,那么你真的不确定吗?

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操作适用于setstr。在前一种情况下,您正在检查确切的字符串匹配;第二,包含连续的子串。我认为你是后者,所以这应该工作。

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]