मेरे पास निम्न कोड है जो IP_TABLE को FP_TABLE देने के लिए उलटा करता है।

IP_TABLE = [58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7]
FP_TABLE = [0]*64
for n in range(64):
    FP_TABLE[IP_TABLE[n]-1] = n+1

यह ठीक काम करता है, लेकिन क्या सूची समझ का उपयोग करना संभव है? मुझे यकीन नहीं था कि यह कैसे करना है क्योंकि सूचकांक वस्तु के मूल्य पर निर्भर करता है।

0
Henry 7 जिंदा 2022, 16:32
क्या आप स्पष्ट कर सकते हैं कि "उलटा" से आपका क्या मतलब है?
 – 
Thrasy
7 जिंदा 2022, 16:43
FP_TABLE में 58वां आइटम 1 होगा, 50वां आइटम 2 होगा, 42वां आइटम 3 होगा और इसी तरह आगे भी जारी रहेगा।
 – 
Henry
7 जिंदा 2022, 16:45

3 जवाब

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

यह ऐसा करेगा, हालांकि यह बहुत अक्षम लगता है:

[IP_TABLE.index(n+1)+1 for n in range(64)]
3
Scott Hunter 7 जिंदा 2022, 16:44

यदि आप इसे और अधिक कुशलता से करना चाहते हैं, तो आपको numpy का सहारा लेना चाहिए:

import numpy as np
IP_TABLE = np.array(IP_TABLE)
FP_TABLE = np.arange(1,65)[np.argsort(IP_TABLE)]

@ स्कॉट के उत्तर की तुलना में:

#%%timeit
[IP_TABLE.index(n+1)+1 for n in range(64)]
#> 54.2 µs ± 17 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

#%%timeit
np.arange(1,65)[np.argsort(IP_TABLE)]
#> 17 µs ± 4.37 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

3 गुना तेज!

1
ibarrond 7 जिंदा 2022, 17:02
आपके उत्तर के लिए धन्यवाद। हालांकि यह अधिक कुशल है, मैं अतिरिक्त पुस्तकालयों का उपयोग नहीं करना पसंद करूंगा।
 – 
Henry
7 जिंदा 2022, 17:05

इसे थोड़ा अलग तरीके से लिखा जा सकता है, लेकिन आपका समाधान पहले से ही एक सूची समझ की तुलना में अधिक कुशल है जो प्रत्येक तत्व को क्रमिक रूप से खोजता है।

IP_TABLE = [58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7]

FP_TABLE = [0]*len(IP_TABLE)
for i,p in enumerate(IP_TABLE,1):
    FP_TABLE[p-1] = i

print(FP_TABLE)
[40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25]
0
Alain T. 7 जिंदा 2022, 17:21