我得到了这个字符串:
\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
我希望这会对某人有所帮助:)如果某人有更好的解决方案,更有效,我想听听一下
答案 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']]
但是请注意,您需要事先知道将要生成的列表数量。