首先我会展示我的代码,然后我会解释:
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_A
和FILE_B
。
我知道关键字in
会以相反的方式工作,但如果不使用其他循环,我找不到优雅的解决方案。
答案 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
运算符适用于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']
答案 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]