मेरे पास तारों की एक सूची है:

fileList = ['YMML.2019.09.10-Run.1-Final.pdf',
            'YMML.2019.09.10-Run.2-Initial.pdf',
            'YMML.2019.09.11-Run.2-Initial.pdf',
            'YMML.2019.09.11-Run.1-Final.pdf',
            'YMML.2019.09.12-Run.2-Initial.pdf',
            'YMML.2019.09.13-Run.2-Initial.pdf',
            'YMML.2019.09.12-Run.1-Final.pdf',
            'YMML.2019.09.13-Run.1-Final.pdf',
            'YMML.2019.09.14-Run.1-Final.pdf',]

और मैं पुष्टि करना चाहता हूं कि प्रत्येक तिथि के लिए एक रन.1-फाइनल और रन.2-प्रारंभिक दोनों है।

मैंने कुछ ऐसा करने की कोशिश की है:

for i in range(len(directoryList)):
    if directoryList[i][5:15] != directoryList[i + 1][5:15]:
        print(directoryList[i] + ' is missing.')
    i += 2

और मैं चाहता हूं कि आउटपुट हो

'YMML.2019.09.14-Run.2-Initial.pdf is missing,

शायद कुछ ऐसा

dates = [directoryList[i][5:15] for i in range(len(directoryList))]
counter = collections.Counter(dates)

लेकिन फिर शब्दकोश से निकालने में परेशानी हो रही है।

0
Tim 20 सितंबर 2019, 18:42
नहीं, फ़ाइल सूची हमेशा क्रमबद्ध नहीं होती है। मेरे पास यह विचार था जैसा मैंने पोस्ट किया था। संपादित देखें।
 – 
Tim
20 सितंबर 2019, 18:52
आपका तरीका लगभग समाप्त हो गया है। बस counter से तारीखों को फ़िल्टर करें जहां गिनती 2 नहीं है। उदाहरण के लिए: [d for d, cnt in counter.items() if cnt < 2]
 – 
pault
20 सितंबर 2019, 18:59
हाँ, ओपी करीब और अच्छा बिंदु था, लेकिन पूर्ण मूल फ़ाइल नाम को पुनर्स्थापित करना अभी भी थोड़ा समस्याग्रस्त है।
 – 
ggorlen
20 सितंबर 2019, 19:15

4 जवाब

इसे और अधिक पठनीय बनाने के लिए, आप पहले तिथियों की एक सूची बना सकते हैं, फिर उन पर लूप कर सकते हैं।

file_list = ['YMML.2019.09.10-Run.1-Final.pdf',
            'YMML.2019.09.10-Run.2-Initial.pdf',
            'YMML.2019.09.11-Run.2-Initial.pdf',
            'YMML.2019.09.11-Run.1-Final.pdf',
            'YMML.2019.09.12-Run.2-Initial.pdf',
            'YMML.2019.09.13-Run.2-Initial.pdf',
            'YMML.2019.09.12-Run.1-Final.pdf',
            'YMML.2019.09.13-Run.1-Final.pdf',
            'YMML.2019.09.14-Run.1-Final.pdf',]

dates = set([item[5:15] for item in file_list])

for date in dates:
   if 'YMML.' + date + '-Run.1-Final.pdf' not in file_list:
      print('YMML.' + date + '-Run.1-Final.pdf is missing')
   if 'YMML.' + date + '-Run.2-Initial.pdf' not in file_list:
      print('YMML.' + date + '-Run.2-Initial.pdf is missing')

set() उन सभी के माध्यम से दो बार लूपिंग से बचने के लिए सूची में अद्वितीय मान लेता है।

1
aybry 20 सितंबर 2019, 18:59
बस FYI करें, यह not in file_list के कारण O(n^2) है, जो सभी मूल फ़ाइलों पर एक रैखिक खोज करता है। आप लुकअप के लिए दूसरा set बना सकते हैं।
 – 
ggorlen
20 सितंबर 2019, 19:11
ठीक है आप @ggorlen हैं! पारितोषिक के लिए धन्यवाद।
 – 
aybry
20 सितंबर 2019, 19:16

मुझे बहुत देर हो चुकी है लेकिन यहां मुझे सबसे आसान तरीका मिला है, शायद सबसे प्रभावशाली नहीं:

for file in fileList:
    if file[20:27] == "1-Final":
        if (file[0:20] + "2-Initial.pdf") not in fileList:
            print(file)
    elif file[19:29] is "2-Initial.pdf":
        if (file[0:20] + "1-Final.pdf") not in fileList:
            print(file)
1
Appa21 20 सितंबर 2019, 19:06

यहां एक O(n) समाधान दिया गया है जो दिनांक के अनुसार आइटम को defaultdict में एकत्रित करता है, फिर देखी गई मात्रा पर फ़िल्टर करता है, शेष मान से मूल नामों को पुनर्स्थापित करता है:

from collections import defaultdict

files = [
    'YMML.2019.09.10-Run.1-Final.pdf',
    'YMML.2019.09.10-Run.2-Initial.pdf',
    'YMML.2019.09.11-Run.2-Initial.pdf',
    'YMML.2019.09.11-Run.1-Final.pdf',
    'YMML.2019.09.12-Run.2-Initial.pdf',
    'YMML.2019.09.13-Run.2-Initial.pdf',
    'YMML.2019.09.12-Run.1-Final.pdf',
    'YMML.2019.09.13-Run.1-Final.pdf',
    'YMML.2019.09.14-Run.1-Final.pdf',
]

seen = defaultdict(list)

for x in files:
    seen[x[5:15]].append(x)

missing = [v[0] for k, v in seen.items() if len(v) < 2]
print(missing) # => ['YMML.2019.09.14-Run.1-Final.pdf']

भागीदारों के नाम प्राप्त करना एक सशर्त के साथ किया जा सकता है:

names = [
    x[:20] + "2-Initial.pdf" if x[20] == "1" else
    x[:20] + "1-Final.pdf" for x in missing
]
print(names) # => ['YMML.2019.09.14-Run.2-Initial.pdf']
1
ggorlen 20 सितंबर 2019, 19:36

यह काम:

fileList = ['YMML.2019.09.10-Run.1-Final.pdf',
            'YMML.2019.09.10-Run.2-Initial.pdf',
            'YMML.2019.09.11-Run.2-Initial.pdf',
            'YMML.2019.09.11-Run.1-Final.pdf',
            'YMML.2019.09.12-Run.2-Initial.pdf',
            'YMML.2019.09.13-Run.2-Initial.pdf',
            'YMML.2019.09.12-Run.1-Final.pdf',
            'YMML.2019.09.13-Run.1-Final.pdf',
            'YMML.2019.09.14-Run.1-Final.pdf',]

initial_set = {filename[:15] for filename in fileList if 'Initial' in filename}
final_set = {filename[:15] for filename in fileList if 'Final' in filename}

for filename in final_set - initial_set:
    print(filename + '-Run.2-Initial.pdf is missing.')
for filename in initial_set - final_set:
    print(filename + '-Run.1-Final.pdf is missing.')
0
arj7192 20 सितंबर 2019, 19:29