[英]Python Itertools permutations only letters and numbers
我只需要得到有字母和數字的排列(排列不可能。“A,B,C,D”我需要它像這樣:“A,B,C,1”)
簡而言之,排列不能只包含字母,而不僅僅是數字。 必須是兩者的結合。
我的代碼:
import itertools
print list(itertools.combinations([0,1,2,3,4,'a','b','c','d'], 4))
然后我得到:
[(0, 1, 2, 3), (0, 1, 2, 4), (0, 1, 2, 'a'), (0, 1, 2, 'b'), (0, 1, 2, 'c'), (0, 1, 2, 'd'), (0, 1, 3, 4), (0, 1, 3, 'a'), (0, 1, 3, 'b'), (0, 1, 3, 'c'), (0, 1, 3, 'd'), (0, 1, 4, 'a'), (0, 1, 4, 'b'), (0, 1, 4, 'c'), (0, 1, 4, 'd'), (0, 1, 'a', 'b'), (0, 1, 'a', 'c'), (0, 1, 'a', 'd'), (0, 1, 'b', 'c'), (0, 1, 'b', 'd'), (0, 1, 'c', 'd'), (0, 2, 3, 4), (0, 2, 3, 'a'), (0, 2, 3, 'b'), (0, 2, 3, 'c'), (0, 2, 3, 'd'), (0, 2, 4, 'a'), (0, 2, 4, 'b'), (0, 2, 4, 'c'), (0, 2, 4, 'd'), (0, 2, 'a', 'b'), (0, 2, 'a', 'c'), (0, 2, 'a', 'd'), (0, 2, 'b', 'c'), (0, 2, 'b', 'd'), (0, 2, 'c', 'd'), (0, 3, 4, 'a'), (0, 3, 4, 'b'), (0, 3, 4, 'c'), (0, 3, 4, 'd'), (0, 3, 'a', 'b'), (0, 3, 'a', 'c'), (0, 3, 'a', 'd'), (0, 3, 'b', 'c'), (0, 3, 'b', 'd'), (0, 3, 'c', 'd'), (0, 4, 'a', 'b'), (0, 4, 'a', 'c'), (0, 4, 'a', 'd'), (0, 4, 'b', 'c'), (0, 4, 'b', 'd'), (0, 4, 'c', 'd'), (0, 'a', 'b', 'c'), (0, 'a', 'b', 'd'), (0, 'a', 'c', 'd'), (0, 'b', 'c', 'd'), (1, 2, 3, 4), (1, 2, 3, 'a'), (1, 2, 3, 'b'), (1, 2, 3, 'c'), (1, 2, 3, 'd'), (1, 2, 4, 'a'), (1, 2, 4, 'b'), (1, 2, 4, 'c'), (1, 2, 4, 'd'), (1, 2, 'a', 'b'), (1, 2, 'a', 'c'), (1, 2, 'a', 'd'), (1, 2, 'b', 'c'), (1, 2, 'b', 'd'), (1, 2, 'c', 'd'), (1, 3, 4, 'a'), (1, 3, 4, 'b'), (1, 3, 4, 'c'), (1, 3, 4, 'd'), (1, 3, 'a', 'b'), (1, 3, 'a', 'c'), (1, 3, 'a', 'd'), (1, 3, 'b', 'c'), (1, 3, 'b', 'd'), (1, 3, 'c', 'd'), (1, 4, 'a', 'b'), (1, 4, 'a', 'c'), (1, 4, 'a', 'd'), (1, 4, 'b', 'c'), (1, 4, 'b', 'd'), (1, 4, 'c', 'd'), (1, 'a', 'b', 'c'), (1, 'a', 'b', 'd'), (1, 'a', 'c', 'd'), (1, 'b', 'c', 'd'), (2, 3, 4, 'a'), (2, 3, 4, 'b'), (2, 3, 4, 'c'), (2, 3, 4, 'd'), (2, 3, 'a', 'b'), (2, 3, 'a', 'c'), (2, 3, 'a', 'd'), (2, 3, 'b', 'c'), (2, 3, 'b', 'd'), (2, 3, 'c', 'd'), (2, 4, 'a', 'b'), (2, 4, 'a', 'c'), (2, 4, 'a', 'd'), (2, 4, 'b', 'c'), (2, 4, 'b', 'd'), (2, 4, 'c', 'd'), (2, 'a', 'b', 'c'), (2, 'a', 'b', 'd'), (2, 'a', 'c', 'd'), (2, 'b', 'c', 'd'), (3, 4, 'a', 'b'), (3, 4, 'a', 'c'), (3, 4, 'a', 'd'), (3, 4, 'b', 'c'), (3, 4, 'b', 'd'), (3, 4, 'c', 'd'), (3, 'a', 'b', 'c'), (3, 'a', 'b', 'd'), (3, 'a', 'c', 'd'), (3, 'b', 'c', 'd'), (4, 'a', 'b', 'c'), (4, 'a', 'b', 'd'), (4, 'a', 'c', 'd'), (4, 'b', 'c', 'd'), ('a', 'b', 'c', 'd')]
我推問這個問題,讓我知道是否有可能知道所獲文件的大小,如果我想保存到文本文件。 我還想知道是否有任何方法可以計算出所有排列要求的時間。
非常感謝你提前。
使用集合交集:
import itertools
import string
numbers = set(range(10))
letters = set(string.ascii_letters)
print([x for x in itertools.combinations([0,1,2,3,4,'a','b','c','d'], 4)
if set(x) & letters and set(x) & numbers])
相當天真的解決方案..
(x
for x in itertools.combinations([0,1,2,3,4,'a','b','c','d'], 4)
if not all(c.isalpha() for c in x) and not all(c.isdigit() for c in x))
mylist=[]
for x in permutations([0,1,2,"a","b","c"],4):
print (x)
mylist.append(x)
for t in permutations([3,4,"c","d"]):
print (t)
mylist.append(t)
我將它們拆分為3位數字3通道,2位數字2通道。 所以編譯t和x是你的答案。第一個循環不能只包含數字或只包含字母因為它的排列4.第二個也不能同樣的原因。所以在列表中編譯結果,意味着你的答案。
如何計算時間;
import time
mylist=[]
start=time.time()
for x in permutations([0,1,2,"a","b","c"],4):
print (x)
mylist.append(x)
for t in permutations([3,4,"c","d"]):
print (t)
mylist.append(t)
end=time.time()
diff=end-start
print ("It took",diff,"seconds")
輸出:
...
...
...
('c', 4, 'd', 3)
('c', 'd', 3, 4)
('c', 'd', 4, 3)
('d', 3, 4, 'c')
('d', 3, 'c', 4)
('d', 4, 3, 'c')
('d', 4, 'c', 3)
('d', 'c', 3, 4)
('d', 'c', 4, 3)
It took 0.5800008773803711 seconds
>>>
編輯有多少排列 :
from itertools import permutations
import time
mylist=[]
start=time.time()
for x in permutations([0,1,2,"a","b","c"],4):
print (x)
mylist.append(x)
for t in permutations([3,4,"c","d"]):
print (t)
mylist.append(t)
end=time.time()
diff=end-start
print ("There is {} permutations.".format(len(mylist)))
print ("It took",diff,"seconds")
輸出:
...
...
...
('d', 3, 4, 'c')
('d', 3, 'c', 4)
('d', 4, 3, 'c')
('d', 4, 'c', 3)
('d', 'c', 3, 4)
('d', 'c', 4, 3)
There is 384 permutations.
It took 0.5120010375976562 seconds
>>>
更新valid_data_types_in_list()函數以在列表中添加其他約束。
def valid_data_types_in_list(input_list):
str_type = False
int_type = False
for element in input_list:
if type(element) == str:
str_type = True
if type(element) == int:
int_type = True
if str_type == int_type == True:
return True
return False
import itertools
output = [x for x in list(itertools.combinations([0,1,2,3,4,'a','b','c','d'], 4)) if valid_data_types_in_list(x)]
print output
要使用filter或ifilter,必須傳遞謂詞函數和序列。 對序列中的每個元素計算謂詞函數一次,過濾器只會將那些將謂詞評估為True的元素轉發。
例如,假設您只想要字符串中的大寫字母:
>>> def is_upper(c):
... return c.upper() == c
...
>>> uppers = filter(is_upper, "lsjdfLSKJDFLljsdlfkjLSFLDJ")
>>> print uppers
LSKJDFLLSFLDJ
或者,如果您只想在某些數字列表中以“6”結尾的數字:
>>> nums_that_end_in_6 = filter(lambda n: n % 10 == 6, range(100))
>>> print nums_that_end_in_6
[6, 16, 26, 36, 46, 56, 66, 76, 86, 96]
(如果您不習慣使用lambdas,當邏輯很簡單時,它們對過濾器很有用。上面的lambda與下面的相同:
def predicate(n):
return n % 10 == 6
nums_that_end_in_6 = filter(predicate, range(100))
在你的情況下,你得到一系列字母和整數值的組合,你只需要那些字母和整數的混合。 因此,您需要編寫一個謂詞函數,該函數在給定您喜歡的序列時返回True。 使用基於集合的解決方案,您的謂詞可能如下所示:
ints = set(range(10))
letters = set(string.letters)
def predicate(seq):
seqset = set(seq)
return seqset & letters and seqset & ints
使用any / all內置函數,您的謂詞可能如下所示:
is_int = lambda x : isinstance(x, int)
is_str = lambda x : isinstance(x, str)
def predicate(seq):
return not(all(is_int(item) for item in seq) or all(is_str(item) for item in seq))
或者,如果您只想查看序列是否包含多於1種類型的項目,您可以編寫:
def predicate(seq):
return len(set(type(item) for item in seq))) > 1
要使用這些謂詞中的任何一個,表單都是相同的:
values = list(string.letters) + range(10)
mixed_letter_int_combinations = filter(predicate, combinations(values, 4))
然后,您可以根據性能,可讀性或您喜歡的任何其他條件選擇您喜歡的謂詞。
您可以通過組合兩個序列中的非空組合來生成正確的組合。
import itertools
def combinations(a, b, n):
for i in xrange(1, n):
for ca in itertools.combinations(a, i):
for cb in itertools.combinations(b, n-i):
yield ca + cb
for r in combinations(list('abcd'), [1, 2, 3, 4], 4):
print r
你得到的組合數量是選擇(A + B,n) - 選擇(A,n) - 選擇(B,n),其中A是a中元素的數量,B是b中元素的數量,“選擇“是二項式系數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.