मैं उस पथ को कैसे क्रमबद्ध कर सकता हूं जिसमें पूर्णांक के साथ-साथ तार भी हों? मेरे फ़ाइल नाम हैं:

tmp_1483228800-1485907200_0, 
tmp_1483228800-1485907200_1,
tmp_1483228800-1485907200_2,
.... 

मुझे उन्हें अंतिम रेखांकन के बाद पूर्णांकों के अनुसार क्रमबद्ध करने की आवश्यकता है। इस तरह मेरा कोड दिखता है:

act = "." + "/*/raw_results.csv"
files = glob.glob(act)
sorted_list = sorted(files, key = lambda x:int(os.path.splitext(os.path.dirname(x))[0]))

मुझे पता है कि समस्या यह है कि बीच में बहुत सारे पूर्णांक और कुछ तार हैं, इसलिए यह सब कुछ पूर्णांक में परिवर्तित नहीं कर सकता है, लेकिन मुझे नहीं पता कि इसे कैसे हल किया जाए। अग्रिम में धन्यवाद।

2
Maryam Nahid 3 अप्रैल 2018, 11:51

2 जवाब

सबसे बढ़िया उत्तर

आपकी टिप्पणियों के अनुसार, आपकी फ़ाइलें इस प्रारूप में होंगी:

>>> files = [".../data/tmp_1483228801-1485907200_10/raw_results.csv",
             ".../data/tmp_1483228800-1485907200_1/raw_results.csv",
             ".../data/tmp_1483228801-1485907201_30/raw_results.csv",
             ".../data/tmp_1483228801-1485907200_2/raw_results.csv",
             ".../data/tmp_1483228801-1485907201_9/raw_results.csv"]

फिर आप उन पूर्ण, कच्चे फ़ाइल पथों में सभी नंबरों को निकाल सकते हैं, और उन्हें int में बदल सकते हैं। पथ को निर्देशिका पथ खंडों में विभाजित करने की आवश्यकता नहीं है।

>>> [[int(n) for n in re.findall(r"\d+", f)] for f in files]
[[1483228801, 1485907200, 10],
 [1483228800, 1485907200, 1],
 [1483228801, 1485907201, 30],
 [1483228801, 1485907200, 2],
 [1483228801, 1485907201, 9]]

यह सभी पथ में संख्याओं को निकालेगा और उनके अनुसार क्रमबद्ध करेगा, जो इसे मिलने वाली पहली संख्या को सर्वोच्च प्राथमिकता देगा। यदि वे सभी अन्य संख्याएँ समान हैं, तो यह कोई समस्या नहीं है, और यदि वे भिन्न हैं, तो यह पहले उनके अनुसार छाँटेगा।

>>> sorted(files, key=lambda f: [int(n) for n in re.findall(r"\d+", f)])
['.../data/tmp_1483228800-1485907200_1/raw_results.csv',
 '.../data/tmp_1483228801-1485907200_2/raw_results.csv',
 '.../data/tmp_1483228801-1485907200_10/raw_results.csv',
 '.../data/tmp_1483228801-1485907201_9/raw_results.csv',
 '.../data/tmp_1483228801-1485907201_30/raw_results.csv']

यदि आप यही नहीं चाहते हैं, तो आप (थोड़ा बेकार) key=lambda f: [int(n) for n in re.findall(r"\d+", f)][-1] का उपयोग केवल अंतिम संख्या के आधार पर छाँटने के लिए कर सकते हैं।

1
tobias_k 3 अप्रैल 2018, 10:17

आप कुंजी के लिए बस str.rsplit() का उपयोग कर सकते हैं:

>>> lst = ['tmp_1483228800-1485907200_1', 'tmp_1483228800-1485907200_2','tmp_1483228800-1485907200_0']
>>> sorted(lst, key=lambda x: int(x.rsplit('_', 1)[-1]))
['tmp_1483228800-1485907200_0', 'tmp_1483228800-1485907200_1', 'tmp_1483228800-1485907200_2']
2
Jean-François Fabre 3 अप्रैल 2018, 09:15