找到相同的元素的差异

时间:2016-01-24 19:01:18

标签: python algorithm python-2.7

我昨晚刚开始学习Pythonby。我已经完成了一些简单的操作,例如从用户获取文件,逐行打开和读取该文件,计算每行的整数数,计算每行使用set的唯一整数数,以及计算数这似乎是每行最多的。

我正在研究并希望实现的另一个有趣的概念是根据相邻整数的数量计算整数的数量。这可能听起来有点令人困惑,所以我将在下面解释:

说我有一个包含值的列表:

['1', '2', '2', '2', '2', '2', '3', '3', '4', '4', '4', '4', '5', '5', '6', '7', '7', '7', '1', '1\n']

(我相信我必须将字符串转换为int?) 第一个整数是1,第二个整数是2.差值不是0是两个整数不相同所以不增加计数器。取下一个整数,即2和前一个整数,即2。差值为0,所以两个整数是相同的,所以增加一个计数器。等等。在这种情况下,最终值为8。

我在SO和互联网上查看了相邻的整数计算,并且只发现了我认为可以应用的减法算法。

到目前为止,这是我目前没有将字符串转换为int的问题(请稍后我对此有疑问):

x = [1,2,2,2,2,2,3,3,4,4,4,4,5,5,6,7,7,7,1,1]
count = 0
xdiff = [x[n]-x[n-1] for n in range(1,len(x))]
print xdiff
all([xdiff[0] == xdiff[n] for n in range(1,len(xdiff))])
for n in range(1,len(xdiff)):
    last = x[n-1]
if xdiff!=0:
      print "Different numbers"
      print last
      if xdiff==0:
        print "Same numbers"
        count+=1

这是输出:

[1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, -6, 0]
Different numbers
7

第一次打印只是用于测试,但是当计算正确时,最后一次打印应为9。

有关如何改进算法以计算列表中不包括相同相邻整数的整数总数的任何建议(如上所述,以便澄清)?此外,由于我刚开始自学Python,因此对我的代码的一般改进的任何建议都非常感谢。谢谢。

更新: 所以我意识到我的计算值不正确,总数应该是8而不是9.这是一个更好的解释: 我在列表中有以下数字: [1,2,2,2,2,2,3,3,4,4,4,4,5,5,6,7,7,7,1,1] 总共有20个元素。 相邻整数的数量是8。 从1开始,看看2. 1和2是不一样的增量。查看下一个值2和前一个值2. 2和2是相同的。查看下一个值2和前一个值2. 2和2是相同的。查看下一个值2和前一个值2. 2和2是相同的。查看下一个值2和前一个值2. 2和2是相同的。查看下一个值3和前一个值2. 3和2是不一样的增量。等等。

现在所有的答案都比正确答案少一个,那么由于数据[0]的起点,我只需要在我的总数中添加一个答案吗?

更新: 输出:

['1', '2', '3', '4', '5', '6', '5', '4', '5\n']
bursts: 0

['14', '62', '48', '14\n']
bursts: 0

['1', '3', '5', '7', '9\n']
bursts: 0

['123', '456', '789', '1234', '5678\n']
bursts: 0

['34', '34', '34', '34', '34\n']
bursts: 4


['1\n']
bursts: 0

['1', '2', '2', '2', '2', '2', '3', '3', '4', '4', '4', '4', '5', '5', '6', '7', '7', '7', '1', '1\n']
bursts: 12

代码:

#Open the file corresponding to the name of the file
#the user entered. Open and read the file.
with open(filename, 'r') as file:

    #Read the file in line by line
    for line in file:

        #Remove all empty lines and lines that start with a # sign
        if line.strip() and not line.startswith("#"):

            #Calculate the number of integers per line
            names_list.append(line)
            #print "integers:", len(line.split())

            print names_list
            #Calculate the number of bursts
            result = sum(int(names_list[i]) == int(names_list[i+1]) for i in range(len(names_list)-1))
            print "bursts:", result

输出应为:

bursts:9
bursts:4
bursts:5
bursts:5
bursts:1
bursts:1
bursts:8

3 个答案:

答案 0 :(得分:2)

关于python的好处是使用你已经免费获得的东西。像zip

>>> numbers = [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, -6, 0]
>>> pairs = zip(numbers, numbers[1:])
>>> sum(x == y for x, y in pairs)
7

这会通过压缩这两个列表来生成所有对:

[1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, -6, 0] # numbers
[0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, -6, 0] # numbers[1:]
# generates: [(1, 0), (0, 0), (0, 0), (0, 0), (0, 1), (1, 0),
#             (0, 1), (1, 0), (0, 0), (0, 0), (0, 1), (1, 0),
#             (0, 1), (1, 1), (1, 0), (0, 0), (0, -6), (-6, 0)]

然后,它检查哪些是相同的(它还使用True计为1的事实,因此一个简单的sum工作。)

通常可以避免保留索引和处理边缘情况。

答案 1 :(得分:1)

更简单地说,使用每次递增1的计数器并检查相邻值是否相等:

l1 = ['1', '2', '2', '2', '2', '2', '3', '3', '4', '4', '4', '4', '5', '5', '6', '7', '7', '7', '1', '1\n']

nums = [int(num) for num in l1]

sum(nums[i] == nums[i+1] for i in range(len(nums)-1))
Out[157]: 12

答案 2 :(得分:1)

这是一个有效的代码:

numbers = [1,3,7,11,25,36,57,678,999]
count = sum([numbers[i] == numbers[i+1] for i in range(len(numbers)-1)])
>>> count
8

对于你的例子:

data = [1,2,2,2,2,2,3,3,4,4,4,4,5,5,6,7,7,7,1,1]
result = sum([data[i] == data[i+1] for i in range(len(data)-1)])
>>> result
7