输入是一个字符串(a,b,c,d,...)。在这个字符串中,a表示相同颜色的球,b表示另一种颜色的球等。因此(2,1,3)表示2个红球,1个蓝色球和3个黄色球。
输出1是可能的排列的数量,没有彼此相邻的2个相同颜色的球。
输出2是所有这些排列的列表。
例如:
输入:(2,1,3)
输出1:10排列
输出2:131323,132313,231313,312313,313123等
所以我的主要问题是:如何在Python
程序中过滤2个或更多相同颜色的球彼此相邻的排列?
绝对不是最干净的做事方式,而是使用这个问题的答案:
https://stackoverflow.com/a/36343769/9742036
关于如何检查列表中的相等邻居,这应该可以解决问题。
我们首先生成一个表示您的球组合的列表,查看它们的所有排列,然后过滤掉那些无效的排列。
from itertools import permutations
from operator import eq
input = (2, 1, 3)
# Produce a list to represent the objects to order. (2,1,3) -> [0, 0, 1, 2, 2, 2]
list_of_items = []
current_item = 1
for value in input:
for number in range(value):
list_of_items.append(current_item)
current_item += 1
count_of_valid_permutations = 0
set_of_valid_permutations = set()
# Generate all permutations of our list
for permutation in permutations(list_of_items):
# Permutations treat each ball as unique, even if the same colour, so check we're not over counting.
if permutation not in set_of_valid_permutations:
# Use the eq operator and map it to the permutation to see if any neighbours are equal.
hasEqualNeigbours = any(map(eq, permutation, permutation[1:]))
# If not, then this is a valid permutation.
if not hasEqualNeigbours:
# Record the permutation as seen.
set_of_valid_permutations.add(permutation)
count_of_valid_permutations += 1
print(count_of_valid_permutations)
print(set_of_valid_permutations)
以下代码将解决您的问题:
import numpy as np
num = 221333 ## Any random permutation
lst = list(map(int, str(num)))
req_array = np.diff(lst)
if 0 in req_array:
print ("Yes")
上面的代码在下面的逻辑中工作:
number
转换为array
这有点令人费解,并且可能有一个更有效的版本,但这应该可以解决问题:
output2=['12234','22341','1234','12344']
permut=[]
for num in b: #For every element in the list output2
for n,i in enumerate(num): #For every index and number inside every element of the list
if n>0: #This is only for the next line to work on the first iteration
if num[n]==num[n-1]: #If a number is the same than the previous number
permut.append(num) #append into a new list the whole permutation number
break #Go to the next loop
else:
continue
else:
continue
假设output2
是排列字符串的数组,您可以通过丢弃具有(至少)两个连续颜色代码的排列来过滤数组:
import re
output2 = filter(lambda perm: not re.search(r"(\d)\1", perm), output2)
正则表达式解释:\d
匹配任何数字。周围的括号标记“匹配组”。 \1
解析为第一个匹配组。因此,在组合中,(\d)\1
匹配任何两个连续相同的数字。
如果output2
不是一个数组,而是一个以逗号分隔的列表作为字符串,你可以像这样拆分它,以获得一个数组:
output2 = output2.split(', ')