【问题标题】:Nested list: TypeError: expected string or bytes-like object嵌套列表:TypeError:预期的字符串或类似字节的对象
【发布时间】:2019-05-12 22:21:38
【问题描述】:

我有一个嵌套列表,我想在其中进行一些字符串操作。但是,我遇到了这种类型的错误。有谁知道这是什么意思?

def format_Well_Data(welldata):
       cor_welldata=[]
       for Well in welldata:
            pattern = re.search(r'\d{2}\/',Well)
            ii = pattern.start()
            well2 = Well[0:ii] + '  ' + Well[ii:]
            a=cor_welldata.append(well2)
        print(a)
 format_Well_Data([['AMV-10st102/13/19 4  954  3,968  '],
                  ['AMV-0201/24/19 6  3,078  1,303 ' ]])

The code should add 2 space at the start of the date(mm/dd/yy):
[['AMV-10st1  02/13/19 4  954  3,968  '],['AMV-02  01/24/19 6  3,078  1,303 ' ]]

However, i get this huge error message:
C:\Users\gogut\AppData\Local\Continuum\anaconda3\envs\PTT\python.exe C:/APPL/DPI/PDF_reader/regextest_loop.py
Traceback (most recent call last):
  File "C:/APPL/DPI/PDF_reader/regextest_loop.py", line 14, in <module>
    ['AMV-0201/24/19 6  3,078  1,303 ' ]])
  File "C:/APPL/DPI/PDF_reader/regextest_loop.py", line 6, in format_Well_Data
    pattern = re.search(r'\d{2}\/',Well)
  File "C:\Users\gogut\AppData\Local\Continuum\anaconda3\envs\PTT\lib\re.py", line 182, in search
    return _compile(pattern, flags).search(string)
TypeError: expected string or bytes-like object

【问题讨论】:

  • 看来 welldata 是一个列表,因此你的 for 循环中的 Well 也将是一个列表;但是,您只能在字符串上使用正则表达式进行搜索。也许您想将两个字符串放在一个列表中,而不是将它们单独放在两个列表中?

标签: python list loops nested-lists


【解决方案1】:

您需要从函数中返回数据,并且在您的输入中,您已将数据保留在列表列表中。以下是不修改输入数据的解决方案

import re
def format_Well_Data(welldata):
    cor_welldata=[]
    for Well in welldata:
           for wells in Well:
               pattern = re.search(r'\d{2}\/',wells)
               ii = pattern.start()
               well2 = wells[0:ii] + '  ' + wells[ii:]
               cor_welldata.append(well2)
    print(cor_welldata)
    return cor_welldata

format_Well_Data([['AMV-10st102/13/19 4  954  3,968  '],
                  ['AMV-0201/24/19 6  3,078  1,303 '] ])

否则如果你不修改当前代码那么你可以修改输入数据为

来自

[['AMV-10st102/13/19 4 954 3,968 '],['AMV-0201/24/19 6 3,078 1,303 '] ]

['AMV-10st102/13/19 4 954 3,968 ','AMV-0201/24/19 6 3,078 1,303 ' ]

这里有一点改进代码

import re
def format_Well_Data(welldata):
    cor_welldata=[]
    for Well in welldata:
        patt = re.findall(r'\d\d/\d\d/\d\d',Well)
        str1 = Well.replace(patt[0], ' {}'.format(patt[0]))
        cor_welldata.append(str1)
    return cor_welldata

format_Well_Data(['AMV-10st102/13/19 4  954  3,968  ',
                  'AMV-0201/24/19 6  3,078  1,303 ' ])
"""
output

 ['AMV-10st1 02/13/19 4  954  3,968  ', 'AMV-02 01/24/19 6  3,078  1,303 ']

 """

【讨论】:

  • 您好,感谢您的回复。我有嵌套列表的原因是在它添加空间之后,我将使用 .split() 方法使每个列表有 5 个元素。有办法吗?
  • @Abumaru 添加了此代码的一些改进版本。注意检查输入格式,无需担心拆分
  • 这个解决方案效果很好。感谢您的热心帮助
【解决方案2】:

所以两件事。

首先是re.search 需要一个字符串,目前您提供一个列表。如果只有一个元素,为什么需要包含一个列表?如果有更多只是压平它们?

第二个.append方法不返回附加列表,它返回None。这是一个就地操作,所以只需打印列表即可。

import re
def format_Well_Data(welldata):
    cor_welldata=[]
    for Well in welldata:
        pattern = re.search(r'\d{2}\/', Well)
        ii = pattern.start()
        well2 = Well[0:ii] + '  ' + Well[ii:]
        cor_welldata.append(well2)
    print(cor_welldata)

format_Well_Data(['AMV-10st102/13/19 4  954  3,968  ',
                  'AMV-0201/24/19 6  3,078  1,303 ' ])

输出:

['AMV-10st1  02/13/19 4  954  3,968  ', 'AMV-02  01/24/19 6  3,078  1,303 ']

【讨论】:

  • 您好,感谢您的回答。这是一个嵌套列表,因为我计划将这些列表中的每一个拆分为 5 个元素。我使用 re.search 因为我需要在每个列表中找到的第一个正则表达式。 re中有什么方法吗?可以用于列表吗?关于 .append 你是对的。
猜你喜欢
  • 2022-01-21
  • 2019-10-31
  • 1970-01-01
  • 2018-05-30
  • 2018-10-17
  • 2020-07-08
  • 2018-05-04
  • 2017-08-29
  • 1970-01-01
相关资源
最近更新 更多