Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.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 如何将整数合并到一个列表中,[';a';,1,2]变成[';a';,12]_Python_Python 3.x - Fatal编程技术网

Python 如何将整数合并到一个列表中,[';a';,1,2]变成[';a';,12]

Python 如何将整数合并到一个列表中,[';a';,1,2]变成[';a';,12],python,python-3.x,Python,Python 3.x,我有一个列表输入为li=['a',3,4,'b',6,'c',5,1],我希望我的输出列表为li=['a',34,'b',6,'c',51]这里有一种使用groupby并检查项目类型的方法 from itertools import groupby lst = ['a',3,4,'b',6,'c',5,1] nlst = [''.join(i) if c == str else int(''.join(map(str,i))) for c, i in groupby

我有一个列表输入为
li=['a',3,4,'b',6,'c',5,1]
,我希望我的输出列表为
li=['a',34,'b',6,'c',51]

这里有一种使用groupby并检查项目类型的方法

from itertools import groupby

lst = ['a',3,4,'b',6,'c',5,1]

nlst = [''.join(i) if c == str else int(''.join(map(str,i))) 
            for c, i in groupby(lst, key=type)]

print(nlst)
返回:

['a', 34, 'b', 6, 'c', 51]

简短解释

groupby将创建这些项(列表实际上是作为生成器返回的,但现在这并不重要)

然后,我们要么执行str.join(),如果是str,要么将int映射到str,执行str.join()并再次返回int

注意:
lst=['a','b',3,4,'b',6,'c',5,1]#添加一个'b'
将返回:

['ab', 34, 'b', 6, 'c', 51]
如果不需要这样做,您可以重写函数,这样甚至可以更容易理解:

lst = ['a','b',3,4,'b',6,'c',5,1]
nlst = []

for c, i in groupby(lst, key=type):
    if c == int:
        nlst.append(int(''.join(map(str,i))))
    elif c == str:
        nlst.extend(i)
    # If type is not int or str, we skip!
    else:
        pass

print(nlst)
返回:

['a', 'b', 34, 'b', 6, 'c', 51]

进一步阅读:

如果您在理解此解决方案时遇到困难,我想您可以阅读以下内容:

  • Python str.join()连接字符串
  • Python映射从一种类型转换为另一种类型
  • Python类型str、int、list
  • 循环的列表理解压缩[i代表列表中的i]
  • Itertools groupby(此处的关键功能)
  • 您还可以使用re:

    import re
    
    list_ = ['a',3,4,'b',6,'c',5,1]
    
    x = re.split('(\d+)',''.join(str(i) for i in list_))
    
    list_ = [int(i) if i.isdigit() else i for i in x if i] # removing empty values and get correct formatting 
    
    使用纯递归:

    def shrink(l):
      if len(l) <= 1:
        return l
      if type(l[-1]) == int and type(l[-2]) == int:
        l[-2] = int(str(l[-2]) + str(l[-1]))
        return shrink(l[:-1])
      else:
        return shrink(l[:-1]) + [l[-1]]
    
    shrink(lst)
    
    def收缩(l):
    
    如果len(l)到目前为止你尝试了什么?不要说出你的列表
    list
    。它已经被占用了。谢谢你提醒我注意输入错误@AntonvBRYeah,regex是另一个尝试,但是不要忘记转换回整数,否则答案不完整。
    def shrink(l):
      if len(l) <= 1:
        return l
      if type(l[-1]) == int and type(l[-2]) == int:
        l[-2] = int(str(l[-2]) + str(l[-1]))
        return shrink(l[:-1])
      else:
        return shrink(l[:-1]) + [l[-1]]
    
    shrink(lst)