【问题标题】:selecting unique pair form the list in python从python中的列表中选择唯一的对
【发布时间】:2017-03-10 14:18:00
【问题描述】:

问题是: 你得到一个正整数的排序数组和一个数字'X'。打印总和等于 X 的所有数字对。仅打印唯一的数字对,并且这些数字对应按升序排列。

input is: 1,2,3,4,6;5
output should be : 1,4;2,3

到目前为止我的代码:

with open('/tmp/values.txt') as f:
    for numbers in f:
    num_list,sum_list = [  num.split(",")  for num in numbers.rstrip().split(";")]
sum_list = list(map(int,sum_list))
op1 = [(num_list[i],num_list[j]) for i in range(0,len(num_list)) for j in range(0,len(num_list)) if (eval(num_list[i])+eval(num_list[j]) == sum_list[0])]
print (op1)

我得到的输出是:

[('1', '4'), ('2', '3'), ('3', '2'), ('4', '1')]

谁能帮我从上面的列表中选择 ('1','4') 和 ('2','3') 的逻辑吗?

【问题讨论】:

    标签: python python-2.7 python-3.x ipython


    【解决方案1】:

    在执行两个嵌套循环时有一个巧妙的技巧。如果您不想要第二个列表中的所有内容,请执行以下操作:

    for i in range(0, 5):
        for j in range (i+1, 5):
            print str(i)+", "+str(j)
    

    这会导致:

    0, 1
    0, 2
    0, 3
    0, 4
    1, 2
    1, 3
    1, 4
    2, 3
    2, 4
    3, 4
    

    这确保您不会一次又一次地循环遍历相同的数字。这种事情告诉第二个循环不要从与第一个循环相同的位置开始,而是只从一个它还没有到达的数字开始。 (如果你想拥有像0, 0、1, 1 等这样的双打。只需在i 之后取出+1)。

    在您的代码中,您有两个循环:

    for i in range(0,len(num_list)) for j in range(0,len(num_list))
    

    您可以将第二个循环更改为:

    for j in range(i+1,len(num_list))
    

    【讨论】:

      【解决方案2】:

      由于加法是可交换的,所以不需要检查两次:

      with open('/tmp/values.txt') as f:
          for numbers in f:
              num_list, sum_list = [num.split(",") for num in numbers.rstrip().split(";")]
      
              sum_list = list(map(int, sum_list))
              op1 = [(num_list[i], num_list[j]) for i in range(len(num_list)) for j in range(i+1, len(num_list)) if (int(num_list[i]) + int(num_list[j]) == sum_list[0])]
              print(op1)
      

      有一个O(n) 解决方案(我将把它作为练习留给读者)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多