[英]Comparing Lists elements and sets in 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_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
但是我可能會在計算matches
借助正則表達式(或可能是fnmatch
)介紹過濾器
使用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
首先, 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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.