Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 字符串中数字的连续加法_Python_Python 3.x - Fatal编程技术网

Python 字符串中数字的连续加法

Python 字符串中数字的连续加法,python,python-3.x,Python,Python 3.x,我是学习python的新程序员,在如何完成此任务方面遇到了困难: 所以本质上我有一个从文件中导入的要读取的数字字符串,需要将第一个数字和第二个数字相加,并将其转换为正确的ascii字符。例如,如果我正在读取字符串: '36 30 25 40 80 4' >>> s = '36 30 25 40 80 4' >>> i = iter(map(int, s.split())) >>> ''.join(chr(sum(x)) for x in

我是学习python的新程序员,在如何完成此任务方面遇到了困难:

所以本质上我有一个从文件中导入的要读取的数字字符串,需要将第一个数字和第二个数字相加,并将其转换为正确的ascii字符。例如,如果我正在读取字符串:

'36 30 25 40 80 4' 
>>> s = '36 30 25 40 80 4'
>>> i = iter(map(int, s.split()))
>>> ''.join(chr(sum(x)) for x in zip(i, i))
'BAT'
在将它们转换为相应的ASCII字符并打印之前(在本例中为“CAT”),我希望将36与30、25与40、80与4相加,以此类推

到目前为止,我认识到我需要使用split命令分割字符串,然后使用for循环获取连续数字的数据。我可以获得第一个字母的正确值,但在将[1]添加到[0]之后,我无法“告诉”程序自动继续将[2]添加到[3]。我还需要对多行执行此操作

再一次,我是一个新的程序员,所以任何帮助都非常感谢。谢谢

您可以使用列表压缩功能执行此操作,如下所示:


您可以在步骤2中使用范围为的for循环

    for i in range(0, 6, 2):
        do something to el[i] and el[i+1]

通过这种方式,您可以告诉程序转到想要的索引。在这里,循环中的i将获得值:[0,2,4]

您可以使用的特殊用法来配对元素:

s = '36 30 25 40 80 4'
ints = map(int, s.split()) #make into list of ints
sums = map(sum, zip(*[iter(ints)]*2))
print(''.join([chr(i) for i in sums]))
编辑:从技术上讲,
iter
在这里是不必要的,但我写它是因为我有时会忘记什么时候需要它

编辑2:解决以下问题:

获取一个函数和一个iterable(类似于列表),并将该函数应用于该iterable的每个元素。因此
list(map(int,['1','2'])
[int('1')、int('2')]
相同。之所以有
列表
,是因为
映射
实际上返回一个迭代器,该迭代器一次生成一个值,而不是一次生成所有值

here的用法看起来很复杂,但大部分都是标点符号。让我们试着把它分解一下。正如我提到的,这里不需要
iter
,因为
ints
是一个
map
对象,因此已经是一个迭代器,所以我们不必为它制作迭代器。所以现在看起来

sums = map(sum, zip(*[ints]*2))
map
所做的就是在我们配对之后将配对相加,所以我们也放弃它

zip(*[ints]*2)
理解这一点的诀窍是理解列表乘法首先发生

zip(*[ints, ints])
iterable前面的
*
是解包操作符。将其视为将其参数转储到函数中的列表

zip(ints, ints)
那么
zip
到底在做什么呢?
zip
的正常用法是取两个iterable并将元素配对,如下所示

list(zip([1,2,3], [4,5,6])) #put the results from zip into a list
[(1, 4), (2, 5), (3, 6)]
它也适用于两个以上的列表,但这不是我们来这里的目的

需要注意的是,在
zip(ints,ints)
中,两个
ints
参数是相同的对象。这意味着当zip生成第一对时,它首先从其第一个参数
ints
获取下一个元素。那是
36
。然后,它从第二个参数中获取下一个元素,该参数与
ints
相同。因此,下一个元素是
30
。然后,它在一个元组中生成这两个元素,并继续对迭代器的其余部分重复该过程


如果你问自己“为什么写
zip(*[iter(ints)]*2)
zip(ints,ints)
意味着相同的东西?”这是因为你必须确保参数是相同的对象,否则它就不起作用。执行
zip(iter(ints),iter(ints))
将不起作用,因为每个
iter
返回一个不同但相同的迭代器。我记不起什么时候必须使用iter,所以为了安全起见,我一直在使用它。

另一种比Patrick的建议更不透明(尽管更详细)的方法是:

>>> x = '36 30 25 40 80 4'
>>> nums = [int(n) for n in x.split()]
>>> ''.join(chr(sum(nums[i:i+2])) for i in range(0, len(nums), 2))
'BAT'
另一个解决方案:

string = '36 30 25 40 80 4'
numbers = [int(e) for e in string.split()]
res = ''.join([chr(numbers[i]+numbers[i+1]) for i in range(0,len(numbers),2)])
print(res)

输出:BAT

您可以像这样毫不费力地完成:

In [18]: str='36 30 25 40 80 4'

In [19]: nums=str.split()

In [20]: for i in range(0, len(nums), 2):
    print(int(nums[i]) + int(nums[i+1]))
   ....:     
66
65
84

可能你想检查一下,len(nums)是否相等。如果不是,将抛出一个索引器。

如果这是ascii编码,我认为您实际上使用的是“BAT”而不是“CAT”

>>> s = '36 30 25 40 80 4'
>>> ints = [int(n) for n in s.split()]             # convert strings to integers
>>> summed = [x+y for x,y in zip(ints[0::2], ints[1::2])]        # summing pairs
>>> bytearray(summed).decode('ascii')                   # decoding to ascii text
'BAT'

与帕特里克的回答略有不同

>>> t = "36 30 25 40 80 4"
>>> t_s = map(int,t.split())
>>> t_s
[36, 30, 25, 40, 80, 4]
>>> "".join([chr(sum(c)) for c in zip(t_s[1::2],t_s[::2])])
'BAT'

您可以使用扩展列表切片来获取相邻数字对:

s = '36 30 25 40 80 4'
a = [int(x) for x in s.split()] #convert to integers
firsthalf = a[::2] #every other starting from 0
secondhalf = a[1::2] #every other starting from 1
然后,您可以使用
zip
将要求和的两半配对:

pairs = zip(firsthalf, secondhalf)
然后您可以在巴黎的每个部分绘制
sum

ordinals = [sum(x) for x in pairs]
要最终转换为字符串,请调用:

print(''.join([chr(x) for x in ordinals])) #prints: 'BAT'

有很多方法可以做到这一点,但无需创建大量中间列表,您只需创建迭代器并使用生成器来构造字符串:

'36 30 25 40 80 4' 
>>> s = '36 30 25 40 80 4'
>>> i = iter(map(int, s.split()))
>>> ''.join(chr(sum(x)) for x in zip(i, i))
'BAT'

您可以将字符串转换为返回整数的迭代器,并在列表中使用
next
函数:

s = '36 30 25 40 80 4' 

# iter is not necessary in python3
itr = iter(map(int, s.split()))
word = ''.join(chr(a+next(itr)) for a in itr)

print(word)
# BAT

在我看来,这有点干净,因为没有明确的索引。

你把猫和蝙蝠混在一起了吗?这不是OP问的
bytearray(总结)。解码('ascii')
开箱即用,+1“技术上”我很怀疑你是否真的在帮助任何自称的“新编码者”使用这样的语法而不解释自己。@jsbueno抱歉,我不太明白。你是说我应该删除免责声明,我应该删除
iter
,还是说我应该解释
iter
在这里做什么?我是说你应该添加另一个例子,在上面加上一个简单的多行
,用简单的英语写下正在进行的事情,他们保留你当前的例子,并用通俗易懂的英语解释int——否则这个答案对你自己来说就像打代码高尔夫一样好,而对OP来说就不是了——谁都不懂
map
zip
和最后的理解。
map(sum,zip(*[iter(s)]*2))
不是很好pythonic@PatrickHaugh这个解释很有启发性,,但这种方法给我的印象仍然是“很酷的黑客”,而不是最佳实践。实际上,这比Patrick的更容易理解,因为我还没有学习地图和邮政编码功能。谢谢@chillbro在布宜诺斯艾利斯的建议中,我编辑了一篇关于未来的简要概述