比较列表元素和python中的集合

时间:2016-05-12 14:07:26

标签: 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...)

我正在迭代列表以检查每个条目中是否有该组的任何元素。如果是的话,我会把条目复制掉。 在上面的示例场景中,我希望匹配FILE_AFILE_B。 我知道关键字in会以相反的方式工作,但如果不使用其他循环,我找不到优雅的解决方案。

6 个答案:

答案 0 :(得分:1)

Set1不是一个集合(就像你说的那样)而是一个元组,所以你需要强制转换然后你可以使用集合交集来过滤两个重复项

class Users {

protected $ci;
//Constructor
public function __construct(ContainerInterface $ci) {
   $this->ci = $ci;
}
public function getUsers(){

   $ci = $this->ci;
    $settings = require __DIR__ . '/../../src/settings.php';
    $user =  $app = new \Slim\App($settings);

            $userList =$this->db->table('tbl_test')->get();
            $output = array("data" => $userList);
            return json_encode($output);

   }
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

有很多方法可以做到这一点。

import re
pat = re.compile('|'.join(set1))
for match in matches:
    if pat.search(match):
        # do stuff

但我可能会在计算fnmatch

时借助正则表达式(或可能是matches)引入过滤器

答案 3 :(得分:0)

使用any检查每个文件是否匹配。

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

答案 4 :(得分:0)

首先,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']

答案 5 :(得分:0)

您可以使用:

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]