簡體   English   中英

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

[英]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_AFILE_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運算符適用於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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM