python - 如何在Python中消除范围内没有不同打乱组合的数字

标签 python arrays list loops integer

提示是 给定具有相同位数且没有前导零的整数 A 和 B,有多少个不同的置乱对 (i, j) 满足:A <= i < j <= B?

例如,如果我们让 A = 10 且 B = 99,则答案为 36:

(12,21), (13,31), (14,41), (15,51), (16,61), (17,71), (18,81), (19,91), (23,32), (24,42), (25,52), (26,62), (27,72), (28,82), (29,92), (34,43), (35,53), (36,63), (37,73), (38,83), (39,93), (45,54), (46,64), (47,74), (48,84), (49,94), (56,65), (57,75), (58,85), (59,95), (67,76), (68,86), (69,96), (78,87), (79,97), (89,98)

这是我的代码:

import random
import itertools

A = input("Enter integer with no leading zero:")
B = input("Enter integer greater than A with no leading zero:")

A=int(A)
B=int(B)
realArray = []
myArray = []
temparray = []
heyArray = []
count = 0
totalcount = 0
printcount = 0
x = 0

def checkArray(myArray):
    global x
    global temparray
    for i in myArray:
        x = int(i)
        if x not in temparray:
            temparray.append(x)


  def allcombos(li):
    global count
    global myArray
    global realArray
    global heyArray
    global temp
    global printcount
    global A
    global B

    for subset in itertools.permutations(li, len(li)):
        s = ''.join(map(str, subset))
        if int(s) in range(A,B):
            myArray.append(int(s))
            if len(myArray)> 1:
               checkArray(myArray)
                myArray = []

def scrambleint(i):
    i_string = str(i)
    li = list (map(int, i_string))
    allcombos(li)



def main():
    for i in range(A, B):
        scrambleint(i)
    print (temparray)
    print(len(temparray))

main()

我现在的输出是89

[10, 11, 12, 21, 13, 31, 14, 41, 15, 51, 16, 61, 17, 71, 18, 81, 19, 91, 20, 22, 23, 32, 24, 42, 25, 52, 26, 62, 27, 72, 28, 82, 29, 92, 30, 33, 34, 43, 35, 53, 36, 63, 37, 73, 38, 83, 39, 93, 40, 44, 45, 54, 46, 64, 47, 74, 48, 84, 49, 94, 50, 55, 56, 65, 57, 75, 58, 85, 59, 95, 60, 66, 67, 76, 68, 86, 69, 96, 70, 77, 78, 87, 79, 97, 80, 88, 89, 98, 90]

我想从列表中删除 10 和 11 等在范围内没有乱序数字的数字。 (例如,打乱 10 的唯一方法是 01,它不在 A= 10 到 B = 99 的范围内)。感谢任何帮助,谢谢!

最佳答案

你的问题看起来像家庭作业,但这里有一个可以产生所需结果的一行:

from itertools import combinations
A = 10
B = 99
scrambled_pairs = [pair for pair in combinations(range(A, B+1), 2)
                       if pair[0] == (pair[1]%10*10 + pair[1]/10)]
>>> scrambled_pairs
[(12, 21), (13, 31), (14, 41), (15, 51), (16, 61), (17, 71), (18, 81), (19, 91), (23, 32), (24, 42), (25, 52), (26, 62), (27, 72), (28, 82), (29, 92), (34, 43), (35, 53), (36, 63), (37, 73), (38, 83), (39, 93), (45, 54), (46, 64), (47, 74), (48, 84), (49, 94), (56, 65), (57, 75), (58, 85), (59, 95), (67, 76), (68, 86), (69, 96), (78, 87), (79, 97), (89, 98)]
>>>> len(scrambled_pairs)
36

这一切所做的就是迭代 A 和 B 的所有可能组合,并选择 pair[0] 的那些对。是 pair[1] 的“反转” .

注意:这显然是根据您的具体示例量身定制的。对于更通用的解决方案,更改列表理解中的过滤器/条件以一般检测加扰对,例如:

from itertools import combinations, permutations

def is_scrambled_pair(a, b):
    return tuple(str(a)) in permutations(str(b))

A = 10
B = 99
scrambled_pairs = [pair for pair in combinations(range(A, B+1), 2)
                       if is_scrambled_pair(*pair)]
>>> len(scrambled_pairs)
36
>>> scrambled_pairs
[(12, 21), (13, 31), (14, 41), (15, 51), (16, 61), (17, 71), (18, 81), (19, 91), (23, 32), (24, 42), (25, 52), (26, 62), (27, 72), (28, 82), (29, 92), (34, 43), (35, 53), (36, 63), (37, 73), (38, 83), (39, 93), (45, 54), (46, 64), (47, 74), (48, 84), (49, 94), (56, 65), (57, 75), (58, 85), (59, 95), (67, 76), (68, 86), (69, 96), (78, 87), (79, 97), (89, 98)]

A = 100
B = 999
scrambled_pairs = [pair for pair in combinations(range(A, B+1), 2)
                       if is_scrambled_pair(*pair)]
>>> len(scrambled_pairs)
1701
>>> scrambled_pairs[:100]
[(101, 110), (102, 120), (102, 201), (102, 210), (103, 130), (103, 301), (103, 310), (104, 140), (104, 401), (104, 410), (105, 150), (105, 501), (105, 510), (106, 160), (106, 601), (106, 610), (107, 170), (107, 701), (107, 710), (108, 180), (108, 801), (108, 810), (109, 190), (109, 901), (109, 910), (112, 121), (112, 211), (113, 131), (113, 311), (114, 141), (114, 411), (115, 151), (115, 511), (116, 161), (116, 611), (117, 171), (117, 711), (118, 181), (118, 811), (119, 191), (119, 911), (120, 201), (120, 210), (121, 211), (122, 212), (122, 221), (123, 132), (123, 213), (123, 231), (123, 312), (123, 321), (124, 142), (124, 214), (124, 241), (124, 412), (124, 421), (125, 152), (125, 215), (125, 251), (125, 512), (125, 521), (126, 162), (126, 216), (126, 261), (126, 612), (126, 621), (127, 172), (127, 217), (127, 271), (127, 712), (127, 721), (128, 182), (128, 218), (128, 281), (128, 812), (128, 821), (129, 192), (129, 219), (129, 291), (129, 912), (129, 921), (130, 301), (130, 310), (131, 311), (132, 213), (132, 231), (132, 312), (132, 321), (133, 313), (133, 331), (134, 143), (134, 314), (134, 341), (134, 413), (134, 431), (135, 153), (135, 315), (135, 351), (135, 513), (135, 531)]

关于python - 如何在Python中消除范围内没有不同打乱组合的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28846149/

相关文章:

r - 使用自定义函数时 lapply 出现意外结果

python - “float/str/int”对象不可调用错误

Python:带有日期时间轴的 HoverToolol

javascript - Angular 表达式从对象数组中的相等属性获取对象的属性

python - 如何在字典中找到相同的值

python - 按标准拆分列表

python - 检查 tkinter 中按钮的状态

python - 如何在 Python 中发送多维 POST

javascript - 为什么数组字符串之间用逗号分隔?

javascript - 组合/匹配数组