Continous alphabetic list in python and getting every value of it

三世轮回 提交于 2021-01-27 05:45:11

问题


I've almost the same problem like this one: How to make a continuous alphabetic list python (from a-z then from aa, ab, ac etc)

But, I am doing a list in gui like excel, where on the vertical header should be letters ...aa,ab,ac....dg,dh,di... To do it, I have to declare every place on my list to certain letter. It is probably impossible with yield.

I mean, let me say, I have 100 of cells and I want to name them all differently. Cell 1 should be "A", Cell 2 should be "B".... Cell 27 should be "AA" and so one. You know it probably from excel. I could do it manually, but it is going to take a lot of time.

Well, I tried to play a little with this code underneath, but without success. I know that there should be a loop somewhere, but I have no idea where.

from string import ascii_lowercase
import itertools

def iter_all_strings():
    for size in itertools.count(1):
        for s in itertools.product(ascii_lowercase, repeat=size):
            yield "".join(s)

for s in iter_all_strings():
    print(s)
    if s == 'bb':
        break

The scope: "for s in iter_all_strings():" is counting until the break. I would say here should be my loop for iteration for my cells. There's just no place for that.


回答1:


Another alternative, if you want to dive deeper (create up to ~18,000 columns):

from string import ascii_lowercase

letters = list(ascii_lowercase)
num_cols = 100

excel_cols = []
for i in range(0, num_cols - 1):
    n = i//26
    m = n//26
    i-=n*26
    n-=m*26
    col = letters[m-1]+letters[n-1]+letters[i] if m>0 else letters[n-1]+letters[i] if n>0 else letters[i]
    excel_cols.append(col)



回答2:


Try this code. It works by pretending that all Excel column names have two characters, but the first "character" may be the null string. I get the product to accept the null string as a "character" by using a list of characters rather than a string.

from string import ascii_lowercase
import itertools

first_char = [''] + list(ascii_lowercase)
def iter_excel_columns():
    for char1, char2 in itertools.product(first_char, ascii_lowercase):
            yield char1 + char2

for s in iter_excel_columns():
    print(s)
    if s == 'bb':
        break

This gives the printout that you apparently want:

a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
aa
ab
ac
ad
ae
af
ag
ah
ai
aj
ak
al
am
an
ao
ap
aq
ar
as
at
au
av
aw
ax
ay
az
ba
bb



回答3:


Here is another way to approach the problem. This also allows you to give the number of columns you want to generate and will work for any "two character" columns and would also work if you changed the allowed letters for some reason:

from string import ascii_lowercase

letters = list(ascii_lowercase)
num_cols = 100

excel_cols = []
for i in range(0, num_cols - 1):
    col = ""
    if i / len(letters) > 0:
        col = str(letters[i / len(letters) - 1])
    col += letters[i % len(letters)]
    excel_cols.append(col)
print(excel_cols)

#output: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'ag', 'ah', 'ai', 'aj', 'ak', 'al', 'am', 'an', 'ao', 'ap', 'aq', 'ar', 'as', 'at', 'au', 'av', 'aw', 'ax', 'ay', 'az', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'bg', 'bh', 'bi', 'bj', 'bk', 'bl', 'bm', 'bn', 'bo', 'bp', 'bq', 'br', 'bs', 'bt', 'bu', 'bv', 'bw', 'bx', 'by', 'bz', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'cg', 'ch', 'ci', 'cj', 'ck', 'cl', 'cm', 'cn', 'co', 'cp', 'cq', 'cr', 'cs', 'ct', 'cu']

If you wanted to work the exercise of going past two character column names, here's a teaser to get you started. The actual implementation is left as an exercise for the reader:

def get_loops_needed(num_cols):
    loops_needed = 0
    temp = num_cols
    while True:
        temp = temp / len(letters)
        loops_needed += 1
        if temp == 0:
            break
    return loops_needed


来源:https://stackoverflow.com/questions/56452581/continous-alphabetic-list-in-python-and-getting-every-value-of-it

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!