Python 如果不满足条件,则打印一行

Python 如果不满足条件,则打印一行,python,if-statement,conditional-statements,statements,Python,If Statement,Conditional Statements,Statements,大家好,stackoverflowers的同事们,我正在用一个给我的示例问题(实际上是一个Google面试练习问题)练习Python,遇到了一个我不知道如何a)正确摆姿势(因此标题模糊),b)克服的问题 问题是:对于一个数字数组(给定的或随机的),在数组中找到唯一的数字对,当求和时给出一个给定的数字。例如:在下面的数组中找到一对数字,将它们相加为6 [1 2 4 5 11] 因此,在上述情况下: [1,5] and [2,4] 我写的代码是: from secrets import *

大家好,stackoverflowers的同事们,我正在用一个给我的示例问题(实际上是一个Google面试练习问题)练习Python,遇到了一个我不知道如何a)正确摆姿势(因此标题模糊),b)克服的问题

问题是:对于一个数字数组(给定的或随机的),在数组中找到唯一的数字对,当求和时给出一个给定的数字。例如:在下面的数组中找到一对数字,将它们相加为6

[1 2 4 5 11] 
因此,在上述情况下:

[1,5] and [2,4]
我写的代码是:

from secrets import *

i = 10

x = randbelow(10)

number = randbelow(100) #Generate a random number to be the sum that we are after#

if number == 0:
        pass
else:
        number = number

array = []

while i>0: #Generate a random array to use#
        array.append(x)
        x = x + randbelow(10)
        i -= 1

print("The following is a randomly generated array:\n" + str(array))
print("Within this array we are looking for a pair of numbers which sum to " + str(number))

for i in range(0,10):
        for j in range(0,10):
                if i == j or i>j:
                        pass
                else:
                        elem_sum = array[i] + array[j]
                        if elem_sum == number:
                                number_one = array[i]
                                number_two = array[j]
                                print("A pair of numbers within the array which satisfy that condition is: " + str(number_one) + " and " + str(number_two))
                        else:
                                pass
如果没有找到对,我希望行“没有找到对”。我想尝试一下,但不确定它是否正确或如何实现。此外,我不确定如何阻止重复对出现(仅限唯一对),因此,例如,如果我想要22作为一个和,并拥有数组:

[7, 9, 9, 13, 13, 14, 23, 32, 41, 45]

[9,13] would appear twice
最后,如果有冗余,请原谅我/代码编写效率不高,我正在慢慢学习,因此任何其他提示都将不胜感激


感谢阅读:)

您只需添加一个布尔值,其中包含“是否找到了至少一对?”的答案

在代码开头将其初始化为
found=false

然后,只要找到一对(保存当前
print
命令的条件块),只需添加
found=true

在所有搜索(双
循环`)之后,添加以下内容:

if not found:
    print("No pairs were found")

不必实际比较每一对数字,只需迭代列表一次,从目标数字中减去当前数字,然后查看剩余数字是否在列表中。如果首先将列表转换为
集合
,则可以在O(1)中完成查找,从而将总体复杂性从O(n²)降低到O(n)。此外,整个过程可以通过列表在一行中完成:

>>> nums = [1, 2, 4, 5, 11]    
>>> target = 6    
>>> nums_set = set(nums)
>>> pairs = [(n, target-n) for n in nums_set if target-n in nums_set and n <= target/2]
>>> print(pairs)
[(1, 5), (2, 4)]

更新:如果添加到自身的数字等于目标,但在集合中仅包含一次,则上述操作可能会失败。在这种情况下,您可以使用
collections.Counter
而不是
set
并首先检查该数字的多重性

>>> nums = [1, 2, 4, 5, 11, 3]
>>> nums_set = set(nums)
>>> [(n, target-n) for n in nums_set if target-n in nums_set and n <= target/2]
[(1, 5), (2, 4), (3, 3)]
>>> nums_counts = collections.Counter(nums)
>>> [(n, target-n) for n in nums_counts if target-n in nums_counts and n <= target/2 and n != target-n or nums_counts[n] > 1]
[(1, 5), (2, 4)]
nums=[1,2,4,5,11,3] >>>nums_set=set(nums) >>>[(n,target-n)表示nums_集中的n,如果target-n表示nums_集中的n,并且n>>nums_计数=集合。计数器(nums) >>>[(n,target-n)表示nums_中的n计数,如果nums_中的target-n计数,则为n1] [(1, 5), (2, 4)]
首先列出您的约束条件!
  • 添加的数字必须是唯一的
  • 只能添加2个数字
  • 数组的长度可以是任意的
  • 要求和的数字可以是任意的
  • &不要跳过预处理!减少您的问题空间。 有两件事是现成的:

    从您的两条打印语句开始,我将执行
    array=list(set(array))
    将问题空间减少到
    [7,9,13,14,23,32,41,45]

    假设所有有问题的数字都是正数,我会放弃上面的数字:
    number

    array=[x表示数组中的x,如果x
    给出
    [7,9,9,13,13,14]

    将最后两个步骤组合成一个列表理解,然后将其用作
    array
    较小的数组=[x代表列表中的x(设置(数组)),如果x

    它给出了
    数组==[7,9,13,14]


    在这两个步骤之后,你可以做很多事情。我完全知道我还没有回答你的问题,但从这里你得到了这个问题。^这是我认为谷歌想要看到的东西。

    1。如果你在代码2中修复缩进,人们会更容易帮你。完成这一点的简单方法是创建一个名为d
    找到
    并将其设置为
    -然后,如果触发了
    如果elem_sum==number:
    ,则编写一行代码,将
    找到的
    更改为
    @n1c9“修复缩进”这不是很有帮助,缩进是完全有效的。这里有一点改进:不用检查
    i==j或i>j
    ,你可以在范围(j+1,10)
    中为j使用
    。一些更好的解决方案:1.排序并使用两个指针(一个从开始,一个从结束),时间复杂度O(nlogn).2.使用字典,将
    目标-currentValue
    存储为键.O(n)@丁:是的,这是我最初的想法,但我不知道如何使用Python。不过,感谢你的指点,我将以不同的方式重新审视这个问题!这是一个非常简单的解决方案,我学到了一些新的东西。谢谢你!很高兴。另外,我知道这不是你最初问题的一部分,但你也可以创建一个X随机数列表的一部分,该列表更短、更容易理解(如果您理解以下语法):
    random\u nums=[randbown(10)for num in range(10)]
    。这本质上意味着您要创建一个列表,在该列表中,您要迭代
    range(10)
    的每个元素(在本例中,这只意味着迭代10次),然后,在每次迭代中,执行
    randbown(10)
    。谢谢你,这是非常有见地的。我目前正在尝试加强我的申请,以申请CompSci硕士课程(来自工程)因此,解决这些问题,并看到类似于您的简洁解决方案,是一个非常有用的知识工具!但是如果您不介意,请您解释一下更新的第3行(/4行)好吗
    >>> nums = [1, 2, 4, 5, 11, 3]
    >>> nums_set = set(nums)
    >>> [(n, target-n) for n in nums_set if target-n in nums_set and n <= target/2]
    [(1, 5), (2, 4), (3, 3)]
    >>> nums_counts = collections.Counter(nums)
    >>> [(n, target-n) for n in nums_counts if target-n in nums_counts and n <= target/2 and n != target-n or nums_counts[n] > 1]
    [(1, 5), (2, 4)]