2013-10-03 23 views
11

से एक्सेल-शैली स्तंभ नाम जाओ यह जब पंक्ति और स्तंभ आईडी प्रदान की जाती है लेकिन जब मैं row = 1 and col = 104 की तरह मान देना, यह CZ लौटना चाहिए स्तंभ नाम प्रदान करने के लिए कोड है, लेकिन यह रिटर्न [email protected]स्तंभ संख्या

row = 1 
col = 104 
div = col 
column_label = str() 
while div: 
    (div, mod) = divmod(div, 26) 
    column_label = chr(mod + 64) + column_label 

print column_label 

मैं क्या कर रहा हूं में क्या गलत है?

(यह कोड एक्सेल कॉलम है, जहां मैं पंक्ति, कॉलम आईडी मूल्य प्रदान करते हैं और उसी के लिए वर्णमाला मूल्य की उम्मीद के लिए संदर्भ में है।)

+0

@MartijnPieters मुझे पता है कि। मैंने वैरिएबल वैल्यू को इंट वैल्यू से बदल दिया है, लेकिन इसका मतलब यह नहीं है कि सवाल को कम करें। –

+4

मैंने आपके प्रश्न पर मतदान नहीं किया था। कृपया सोचने की गलती न करें कि टिप्पणी और मतदान एक ही बात है। –

+1

आपका प्रश्न * थोड़ा अस्पष्ट है, लेकिन शायद यह स्वरूपण और व्याकरण के लिए शायद अधिक नीचे है। आपने कोड, अपेक्षित परिणाम और परिणाम देखा है, लेकिन यह मुझे स्पष्ट नहीं है कि आप क्या हासिल करने की कोशिश कर रहे हैं। –

उत्तर

14

संपादित करें: मुझे लगता है कि मैं मानता चाहिए, के रूप में कुछ अन्य लोगों-जो मुझे कभी नहीं छोड़ा द्वारा बताया टिप्पणी-कि मेरे उत्तर के पिछले संस्करण (जिसे आपने स्वीकार किया) में एक बग था जिसने इसे 702 से अधिक कॉलम संख्याओं को ठीक से संभालने से रोक दिया (एक्सेल कॉलम 'ZZ' से संबंधित)। तो, शुद्धता के हित में, यह नीचे दिए गए कोड में तय किया गया है, जिसमें अब कई अन्य उत्तरों की तरह एक लूप शामिल है।

यह संभावना है कि आपने इस मुद्दे का सामना करने के लिए पर्याप्त पर्याप्त कॉलम संख्याओं के साथ पिछले संस्करण का कभी भी उपयोग नहीं किया है। एफडब्ल्यूआईडब्ल्यू, MS specs for the current version of Excel का कहना है कि यह 16,384 कॉलम (एक्सेल कॉलम 'XFD') के साथ वर्कशीट का समर्थन करता है।

LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 

def excel_style(row, col): 
    """ Convert given row and column number to an Excel-style cell name. """ 
    result = [] 
    while col: 
     col, rem = divmod(col-1, 26) 
     result[:0] = LETTERS[rem] 
    return ''.join(result) + str(row) 

if __name__ == '__main__': 
    addresses = [(1, 1), (1, 26), 
       (1, 27), (1, 52), 
       (1, 53), (1, 78), 
       (1, 79), (1, 104), 
       (1, 18253), (1, 18278), 
       (1, 702), # -> 'ZZ1' 
       (1, 703), # -> 'AAA1' 
       (1, 16384), # -> 'XFD1' 
       (1, 35277039)] 

    print('({:3}, {:>10}) --> {}'.format('row', 'col', 'Excel')) 
    print('==========================') 
    for row, col in addresses: 
     print('({:3}, {:10,}) --> {!r}'.format(row, col, excel_style(row, col))) 

आउटपुट:

(row,  col) --> Excel 
======================== 
( 1,   1) --> 'A1' 
( 1,  26) --> 'Z1' 
( 1,  27) --> 'AA1' 
( 1,  52) --> 'AZ1' 
( 1,  53) --> 'BA1' 
( 1,  78) --> 'BZ1' 
( 1,  79) --> 'CA1' 
( 1,  104) --> 'CZ1' 
( 1,  18253) --> 'ZZA1' 
( 1,  18278) --> 'ZZZ1' 
( 1,  702) --> 'ZZ1' 
( 1,  703) --> 'AAA1' 
( 1,  16384) --> 'XFD1' 
( 1, 35277039) --> 'BYEBYE1' 
0

मुझे लगता है कि मैं इसे समझ से बाहर। divmod (104,26) mod = 0 देता है जो chr (0 + 64) = 64 यानी '@' बनाता है।

अगर मैं इस लाइन column_label "mod=26 if mod==0 else mod" से पहले मुझे लगता है कि यह ठीक

column_label='' 
div=104 
while div: 
    (div, mod) = divmod(div, 26) 
    mod=26 if mod==0 else mod 
    column_label = chr(mod + 64) + column_label 

print column_label 
1

काम करना चाहिए जोड़ने मुझे लगता है कि यह कुछ इस तरह है:

def get_col(col): 
    """Get excel-style column names""" 
    (div, mod) = divmod(col, 26) 
    if div == 0: 
     return str(unichr(mod+64)) 
    elif mod == 0: 
     return str(unichr(div+64-1)+'Z') 
    else: 
     return str(unichr(div+64)+unichr(mod+64)) 

कुछ परीक्षण:

>>> def get_col(col): 
...  (div, mod) = divmod(col, 26) 
...  if div == 0: 
...   return str(unichr(mod+64)) 
...  elif mod == 0: 
...   return str(unichr(div+64-1)+'Z') 
...  else: 
...   return str(unichr(div+64)+unichr(mod+64)) 
... 
>>> get_col(105) 
'DA' 
>>> get_col(104) 
'CZ' 
>>> get_col(1) 
'A' 
>>> get_col(55) 
'BC' 
11

आपके पास कुछ सूचकांक समस्याएं हैं:

तो आपकी समस्या को ठीक करने के लिए, आप अपने सभी सूचकांकों से मेल खाते हैं बनाने की जरूरत है:

def colToExcel(col): # col is 1 based 
    excelCol = str() 
    div = col 
    while div: 
     (div, mod) = divmod(div-1, 26) # will return (x, 0 .. 25) 
     excelCol = chr(mod + 65) + excelCol 

    return excelCol 

print colToExcel(1) # => A 
print colToExcel(26) # => Z 
print colToExcel(27) # => AA 
print colToExcel(104) # => CZ 
print colToExcel(26**3+26**2+26) # => ZZZ 
4

मैं maritineau का जवाब प्यार के बाद से अपने कोड सादा और पालन करने के लिए आसान लग रहा है। लेकिन यह स्तंभ संख्या को संभाल नहीं सकता जो 26 ** 2 + 26 से अधिक है। इसलिए मैं इसका हिस्सा संशोधित करता हूं।

def excel_col(col): 
    """Covert 1-relative column number to excel-style column label.""" 
    quot, rem = divmod(col-1,26) 
    return excel_col(quot) + chr(rem+ord('A')) if col!=0 else '' 



if __name__=='__main__': 
    for i in [1, 26, 27, 26**3+26**2+26]: 
     print 'excel_col({0}) -> {1}'.format(i, excel_col(i)) 

परिणाम

excel_col(1) -> A 
excel_col(26) -> Z 
excel_col(27) -> AA 
excel_col(18278) -> ZZZ 
0

उपयोग इस कोड:

def xlscol(colnum): 
    a = [] 
    while colnum: 
     colnum, remainder = divmod(colnum - 1, 26) 
     a.append(remainder) 
    a.reverse() 
    return ''.join([chr(n + ord('A')) for n in a]) 
0
def ColNum2ColName(n): 
    convertString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
    base = 26 
    i = n - 1 

    if i < base: 
     return convertString[i] 
    else: 
     return ColNum2ColName(i//base) + convertString[i%base] 

संपादित करें: ठीक है, सही zondo।

मैंने A, B, .. AA, AB, ... अंकों के साथ A-Z अंकों के साथ एक संख्यात्मक आधार के रूप में संपर्क किया।

A = 1 
B = 2 
. 
. 
X = 24 
Y = 25 
Z = 26 
. 
. 
. 

यह किसी भी जबकि पाश आदि के बिना एक आसान तरीका है और किसी भी संख्या > 0 के लिए काम करता है।

+0

आप किसी प्रकार के लूप के बजाय रिकर्सन का उपयोग कर रहे हैं, जो सरल दिखने के दौरान आम तौर पर अधिक ओवरहेड को शामिल करने जा रहा है और केवल एक (छोटी) लूप स्थिति की जांच करने से धीमा हो रहा है। – martineau

संबंधित मुद्दे