엑셀 칼럼처럼 글자를 반복해서 쓰는 건가요?
저는 마이크로소프트 엑셀의 열 문자와 비슷한 문자열 목록을 만들고 싶습니다.예를 들어, 26개의 열 뒤에 다음 열은AA
,AB
,AC
,기타.
모듈러스 연산자를 사용해 보았지만 결국은AA
,BB
,CC
, 등..
import string
passes_through_alphabet = 0
for num, col in enumerate([_ for _ in range(40)]):
if num % 26 == 0:
passes_through_alphabet += 1
excel_col = string.ascii_uppercase[num%26] * passes_through_alphabet
print(num, excel_col)
0 A
1 B
2 C
3 D
...
22 W
23 X
24 Y
25 Z
26 AA
27 BB
28 CC
...
이를 위해 itertools.product를 사용할 수 있습니다.
import string
import itertools
list(itertools.product(string.ascii_uppercase, repeat=2))
출력:
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('A', 'D'), ...
이를 첫 번째 문자 집합과 결합하면 다음과 같은 결과를 얻을 수 있습니다.
list(
itertools.chain(
string.ascii_uppercase,
(''.join(pair) for pair in itertools.product(string.ascii_uppercase, repeat=2))
))
출력:
['A', 'B', 'C', .. 'AA', 'AB', 'AC' .. 'ZZ']
일반화하기 위해 우리는 점점 더 큰 제품을 만드는 발전기를 정의합니다.수익률은 python 3.3+에서만 사용할 수 있지만, python 2의 경우 for loop을 사용하여 각 아이템을 수익률을 낼 수 있습니다.
def excel_cols():
n = 1
while True:
yield from (''.join(group) for group in itertools.product(string.ascii_uppercase, repeat=n))
n += 1
list(itertools.islice(excel_cols(), 28))
산출량
['A', 'B', 'C', ... 'X', 'Y', 'Z','AA', 'AB']
이 답변을 토대로: https://stackoverflow.com/a/182009/6591347
def num_to_excel_col(n):
if n < 1:
raise ValueError("Number must be positive")
result = ""
while True:
if n > 26:
n, r = divmod(n - 1, 26)
result = chr(r + ord('A')) + result
else:
return chr(n + ord('A') - 1) + result
이 생성기 기능은 임의의 알파벳과 함께 작동합니다.
import string
def labels(alphabet=string.ascii_uppercase):
assert len(alphabet) == len(set(alphabet)) # make sure every letter is unique
s = [alphabet[0]]
while 1:
yield ''.join(s)
l = len(s)
for i in range(l-1, -1, -1):
if s[i] != alphabet[-1]:
s[i] = alphabet[alphabet.index(s[i])+1]
s[i+1:] = [alphabet[0]] * (l-i-1)
break
else:
s = [alphabet[0]] * (l+1)
> x = labels(alphabet='ABC')
> print([next(x) for _ in range(20)])
['A', 'B', 'C', 'AA', 'AB', 'AC', 'BA', 'BB', 'BC', 'CA', 'CB', 'CC', 'AAA', 'AAB', ... ]
현재 문자열에서 다음 문자열을 생성합니다.
뒤에서 알파벳의 마지막이 아닌 첫 번째 문자를 찾습니다. 예:
!= 'Z'
b) increment it: 다음 알파벳 문자로 설정
c) 모든 다음 문자를 첫 번째 알파벳 문자로 재설정
그러한 증가할 수 있는 문자를 찾을 수 없는 경우, 모든 첫 알파벳 문자로 다시 시작하고, 길이를 다음과 같이 증가시킵니다.
1
특히 많은 라벨이 생성되는 경우, 메모리 사용량이 훨씬 더 많은 (훨씬) 비용으로 보다 판독 가능한/종합적인 기능을 작성할 수 있습니다.
def labels(alphabet=string.ascii_uppercase):
agenda = deque(alphabet)
while agenda:
s = agenda.popleft()
yield s
agenda.append([s+c for c in alphabet])
내 솔루션:
itertools.chain(*[itertools.product(map(chr, range(65,91)), repeat=i) for i in xrange(1, 10)])
매직넘버 10번을 참고하시기 바랍니다. 열 이름의 최대 글자 수 입니다.
설명:
먼저 A-Z 문자를 목록으로 작성합니다.
map(chr, range(65,91))
그런 다음 제품을 사용하여 조합을 만듭니다(길이는 1부터 시작하여 10까지).
itertools.product(map(chr, range(65,91)), repeat=i)
그리고 마지막으로 모든 발전기를 하나의 발전기로 연결합니다.itertools.chain
이게 더 쉬울 것 같습니다.
cols = [chr(x) for x in range(65, 91)] + \
[chr(x) + chr(y) for x in range(65, 91) for y in range(65, 91)] + \
[chr(x) + chr(y) + chr(z) for x in range(65, 91) for y in range(65, 91) for z in range(65, 91)]
언급URL : https://stackoverflow.com/questions/42176498/repeating-letters-like-excel-columns
'programing' 카테고리의 다른 글
getline의 첫 번째 인수가 "char*" 대신 포인터 "char**"를 가리키는 포인터인 이유는 무엇입니까? (0) | 2023.10.03 |
---|---|
Pandas dataframe 열에 중복된 값 확인 (0) | 2023.10.03 |
오류: 요청 헤더 필드 Content-Type은 Access-Control-Allow-Headers에서 허용되지 않습니다. (0) | 2023.10.03 |
Facebook Comments 소셜 플러그인의 최근 댓글을 표시하는 방법은? (0) | 2023.10.03 |
Android에서 Soft Keyboard Next(소프트 키보드 다음)을 클릭하면 다른 텍스트 편집 텍스트로 이동 (0) | 2023.10.03 |