如何将字符串分成2个列表

时间:2018-11-10 14:40:56

标签: python-3.x

我得到了这个字符串:

\n
\n
N\tO\tHP\tM\tD\tU\tI\tN\tO\n
E\tS\tA\tE\tI\tT\tL\tN\tI\tN\n
N\tP\tN\tN\tN\tG\tAO\tD\tC\n
\n
\n
PERMANENTE
PETTINE
\n
\n

实际上,如果您查看原始字符串,则看不到\ t和\ n,因此我只是为了更好地理解而进行了编辑。

我要做什么是将两个单独的列表分开,例如:

lists1 = [[NOHPMDUINO][ESAEITLNIN][NPNNNGAODC]]
lists2 = [[PERMANENTE][PETTINE]]

我尝试使用许多方法来解决此问题,但没有成功。 首先,我在一开始使用.strip('\ n')方法删除了新行,然后尝试使用replace,但是我不知道如何正确设置。

谢谢zsomko和snakecharmerb, 使用zsomko的方法并在开始时添加strip()删除换行符,这是我划分为2个变量的循环:

var = True
for line in t:
    if line !=['']:
        if var:
            group1.append(line)
        else:
            group2.append(line)
    else:
        var = False

我希望这会对某人有所帮助:)如果某人有更好的解决方案,更有效,我想听听一下

2 个答案:

答案 0 :(得分:2)

首先消除标签,并将string分成几行:

lines = [line.replace('\t', '') for line in string.splitlines()]

然后,下面的代码将按预期生成变量groups中的列表列表:

groups = []
group = []
for line in lines:
    if group and not line:
        groups.append(group)
        group = []
    elif line:
        group.append(line)

答案 1 :(得分:1)

您可以使用其splitlines方法将字符串分成几行-这将为您提供行列表,而不会终止换行符('\ n')。

然后,您可以遍历列表,并使用str.replace方法用空字符串替换制表符。

>>> for line in s.splitlines():
...     if not line:
...         # Skip empty lines
...         continue
...     cleaned = line.replace('\t', '')
...     print(cleaned)
... 
NOHPMDUINO
ESAEITLNIN
NPNNNGAODC
PERMANENTE
PETTINE

将输出分组到列表列表中比较麻烦。这个问题没有提到分组的标准,因此让我们假定未用空行分隔的行应一起列出。

我们可以使用generator遍历字符串,对相邻的行进行分组,并将它们作为列表发出,如下所示:

>>> def g(s):
...     out = []
...     for line in s.splitlines():
...         if not line:
...             if out:
...                 yield out
...                 out = []
...             continue
...         cleaned = line.replace('\t', '')
...         out.append([cleaned])
...     if out:
...         yield out
... 
>>> 

生成器会在列表(out)中收集行,每次发现空白行且列表不为空时,它都会产生 的结果。如果产生列表,则将其替换为空列表。循环遍历字符串中的所有行后,如果字符串不以空行结尾,则它会再次产生列表(如果不为空)。

遍历生成器会依次返回列表列表。

>>> for x in g(s):print(x)
... 
[['NOHPMDUINO'], ['ESAEITLNIN'], ['NPNNNGAODC']]
[['PERMANENTE'], ['PETTINE']]

或者,如果要获取列表列表,请在生成器上调用list

>>> lists = list(g(s))
>>> print(lists)
[[['NOHPMDUINO'], ['ESAEITLNIN'], ['NPNNNGAODC']], [['PERMANENTE'], ['PETTINE']]]

如果要将结果分配给命名变量,可以将调用解压缩到list

>>> group1, group2 = list(g(s))
>>> group1
[['NOHPMDUINO'], ['ESAEITLNIN'], ['NPNNNGAODC']]
>>> group2
[['PERMANENTE'], ['PETTINE']]

但是请注意,您需要事先知道将要生成的列表数量。