2012-06-21 41 views
12

Tôi muốn viết một chương trình mà sẽ mất một chuỗi, chúng ta hãy nói "Fox", sau đó nó sẽ hiển thị:Tìm tất cả trên, dưới và hỗn hợp kết hợp trường hợp của một chuỗi

fox, Fox, fOx, foX, FOx, FoX, fOX, FOX 

Mã của tôi cho đến nay:

string = raw_input("Enter String: ") 
length = len(string) 
for i in range(0, length): 
    for j in range(0, length): 
     if i == j: 
      x = string.replace(string[i], string[i].upper()) 
      print x 

Output cho đến nay:

Enter String: fox 
Fox 
fOx 
foX 
>>> 
+2

Bạn có được phép sử dụng chức năng thư viện cho việc này? – georg

+2

@thg: Anh ấy không nói đó là bài tập về nhà, vì vậy rõ ràng anh ấy muốn giải pháp thanh lịch nhất (có thể sẽ liên quan đến 'itertools';) –

+0

có. Tôi cho phép – Whiskey

Trả lời

23
>>> import itertools 
>>> map(''.join, itertools.product(*((c.upper(), c.lower()) for c in 'Fox'))) 
['FOX', 'FOx', 'FoX', 'Fox', 'fOX', 'fOx', 'foX', 'fox'] 

Hoặc

>>> s = 'Fox' 
>>> map(''.join, itertools.product(*zip(s.upper(), s.lower()))) 
+0

đánh bại tôi! – beoliver

+0

Giải pháp rất đẹp. –

+0

Điều này thật tuyệt, nhưng nó đòi hỏi một số giải thích. – Marcin

5

tôi luôn muốn thử loại này.

Không có ý tưởng nếu điều này phù hợp với trình độ của bạn (nó hoạt động mặc dù).

str = raw_input() 
def getBit(num, bit): 
    return (num & 1 << bit) != 0 



for i in xrange(0,2**len(str)): 
    out = "" 
    for bit in xrange(0,len(str)): 
     if getBit(i,bit): 
     out += str[bit].upper() 
     else: 
     out += str[bit].lower() 

    print out 

Ý tưởng là khi bạn tăng số nhị phân, bạn nhận được mọi hoán vị có thể là 1 và 0.

Sau đó, bạn chỉ cần chuyển đổi danh sách số 1 và 0 thành chuỗi, 1 nghĩa là chữ hoa, 0 có nghĩa là chữ thường.

1

lót sử dụng danh sách hiểu:

from itertools import permutations 
strs='fox' 
combin=[''.join(x)for x in permutations(list(strs)+list(strs.upper()),3) if ''.join(x).lower()=='fox'] 
print(combin) 
['fox', 'foX', 'fOx', 'fOX', 'Fox', 'FoX', 'FOx', 'FOX'] 

sử dụng cho trong vòng lặp:

from itertools import permutations 
strs='fox' 
lis2=list(strs)+list(strs.upper()) 
for x in permutations(lis2,3): 
    if ''.join(x).lower()=='fox': 
     print(''.join(x)) 

fox 
foX 
fOx 
fOX 
Fox 
FoX 
FOx 
FOX 
+0

Cảm ơn Ashwini..all các bài đăng đã hữu ích cho tôi .. – Whiskey

1

Đây là tuyệt vời, chấp nhận câu trả lời của @ ephemient sửa đổi một chút.

Thay đổi:

  • thấp hợp cụ thể trước khi chữ hoa, chỉ để danh sách bắt đầu với "con cáo" thay vì "FOX" (chuỗi ví dụ của câu hỏi bắt đầu với "con cáo")

  • sử dụng một sự hiểu biết danh sách thay vì map() (một trong hai cách là tốt, thực sự)

  • nổ ra mã mà tạo ra dưới/trên cặp trường hợp để làm cho nó rõ ràng hơn

  • đóng gói nó thành một hàm.

Mã:

import itertools as it 

def cap_permutations(s): 
    lu_sequence = ((c.lower(), c.upper()) for c in s) 
    return [''.join(x) for x in it.product(*lu_sequence)] 
Các vấn đề liên quan