Python 两份清单有什么不同?

Python 两份清单有什么不同?,python,regex,Python,Regex,我有一个列表,我使用regex删除列表中字符串中的空格,这非常有效- newrooms = re.sub(r'\s+', " ", str(newrooms)) 原始列表看起来像- [['4 11-12pm', 'MR252 (30)'], ['5 10.30-12pm', 'MR252 (30)'], ['8 10-11am', 'MR252 (30)'], ['9 11-12pm', 'MR252 (30)'], ['10 10-11am

我有一个列表,我使用regex删除列表中字符串中的空格,这非常有效-

newrooms = re.sub(r'\s+', " ", str(newrooms)) 
原始列表看起来像-

[['4      11-12pm', 'MR252 (30)'], ['5      10.30-12pm', 'MR252 (30)'], ['8      10-11am', 'MR252 (30)'], ['9      11-12pm', 'MR252 (30)'], ['10      10-11am', 'MR252 (30)'], ['10      11-12pm', 'MR251 (22)'], ['12      10-11am', 'MR107 (63)'], ['12      11-12pm', 'MR252 (30)'], ['17      10-11am', 'MR252 (30)'], ['18      11-12pm', 'MR252 (30)'], ['19      10-11am', 'MR252 (30)'], ['19      11-12pm', 'MR265 (24)'], ['20      10-11am', 'CB203 (26)'], ['20      11-12pm', 'MR252 (30)'], ['27      10-11am', 'MR252 (30)'], ['28      11-12pm', 'MR252 (30)'], ['29      10-11am', 'MR252 (30)'], ['42      11-12pm', 'MR252 (30)'], ['42       2-4pm                MA ONLY', 'MR252 (30)'], ['43      10-11am', 'MR252 (30)'], ['44      10-11am', ''], ['44      11-12pm', 'MR252 (30)']]
打印新房间[3]打印。。。“['911-12pm','MR252(30)'”

使用re.sub删除空格后,列表如下所示

[['4 11-12pm', 'MR252 (30)'], ['5 10.30-12pm', 'MR252 (30)'], ['8 10-11am', 'MR252 (30)'], ['9 11-12pm', 'MR252 (30)'], ['10 10-11am', 'MR252 (30)'], ['10 11-12pm', 'MR251 (22)'], ['12 10-11am', 'MR107 (63)'], ['12 11-12pm', 'MR252 (30)'], ['17 10-11am', 'MR252 (30)'], ['18 11-12pm', 'MR252 (30)'], ['19 10-11am', 'MR252 (30)'], ['19 11-12pm', 'MR265 (24)'], ['20 10-11am', 'CB203 (26)'], ['20 11-12pm', 'MR252 (30)'], ['27 10-11am', 'MR252 (30)'], ['28 11-12pm', 'MR252 (30)'], ['29 10-11am', 'MR252 (30)'], ['42 11-12pm', 'MR252 (30)'], ['42 2-4pm MA ONLY', 'MR252 (30)'], ['43 10-11am', 'MR252 (30)'], ['44 10-11am', ''], ['44 11-12pm', 'MR252 (30)']]
相同(减去空格),但现在=

打印新房间[3]打印。。。“4”

这里的所有代码=

print newrooms[3]
print newrooms
newrooms = re.sub(r'\s+', " ", str(newrooms))
print newrooms[3]
print newrooms
为什么现在列表的行为不像列表

好了,伙计们,我明白了,我正在用str(newrooms)将整个列表转换成字符串,我应该做的是

 print newrooms[3]
    print newrooms
    for obj in newrooms:
        obj[0] = re.sub(r'\s+', " ", (obj[0]))
    print newrooms[3]
    print newrooms
之后

newrooms
,以前是一个
list()
,现在变成了一个字符串

print newrooms[3]

打印该字符串中的第四个字符。Python不需要输入变量,因此每个变量都可以灵活地适应存储在其中的内容。

您可以将
列表
转换为此行中的单个字符串:

newrooms = re.sub(r'\s+', " ", str(newrooms))
所以它只是一个字符串,不再是一个列表。 您要做的是对列表中的单个元素应用替换:

newrooms = [
    [re.sub(r'\s+', " ", elem) for elem in sublist]
    for sublist in newrooms
]
这导致:

>>> newrooms[3]
['9 11-12pm', 'MR252 (30)']

它返回意外的结果,因为您在替换之前将列表转换为字符串。请尝试以下方法:

import re
newrooms = [['4      11-12pm', 'MR252 (30)'], ['5      10.30-12pm', 'MR252 (30)'], ['8      10-11am', 'MR252 (30)'], ['9      11-12pm', 'MR252 (30)'], ['10      10-11am', 'MR252 (30)'], ['10      11-12pm', 'MR251 (22)'], ['12      10-11am', 'MR107 (63)'], ['12      11-12pm', 'MR252 (30)'], ['17      10-11am', 'MR252 (30)'], ['18      11-12pm', 'MR252 (30)'], ['19      10-11am', 'MR252 (30)'], ['19      11-12pm', 'MR265 (24)'], ['20      10-11am', 'CB203 (26)'], ['20      11-12pm', 'MR252 (30)'], ['27      10-11am', 'MR252 (30)'], ['28      11-12pm', 'MR252 (30)'], ['29      10-11am', 'MR252 (30)'], ['42      11-12pm', 'MR252 (30)'], ['42       2-4pm                MA ONLY', 'MR252 (30)'], ['43      10-11am', 'MR252 (30)'], ['44      10-11am', ''], ['44      11-12pm', 'MR252 (30)']]

newrooms = [[re.sub(r'\s+', " ", room) for room in rooms] for rooms in newrooms]
print newrooms[3]

您想要的是将重复的空格序列替换为列表列表中每个字符串的一个空格

您实际要做的是将列表转换为字符串,然后执行替换操作

下面是发生的情况-为了便于阅读,我将使用原始列表的缩短版本:

>>> import re
>>> newrooms = [['4      11-12pm', 'MR252 (30)'], ['5      10.30-12pm', 'MR252 (30)']]
>>> newrooms_str = str(newrooms)
>>> newrooms_str
"[['4      11-12pm', 'MR252 (30)'], ['5      10.30-12pm', 'MR252 (30)']]"
>>> newrooms_str = re.sub(r'\s+', " ", newrooms_str)
>>> newrooms_str
"[['4 11-12pm', 'MR252 (30)'], ['5 10.30-12pm', 'MR252 (30)']]"
>>> newrooms_str[3]
'4'
如您所见,您正在将一个字符串传递给
re.sub
,它返回一个字符串。该字符串的第四个字符是字符
'4'
,您在执行
newrooms\u str[3]
时会看到该字符

为了获得所需的结果,您需要对列表列表中的各个字符串进行操作:

>>> newrooms
[['4      11-12pm', 'MR252 (30)'], ['5      10.30-12pm', 'MR252 (30)']]
>>> newrooms = [[re.sub(r'\s+', " ", string) for string in sublist] for sublist in newrooms]
>>> newrooms
[['4 11-12pm', 'MR252 (30)'], ['5 10.30-12pm', 'MR252 (30)']]
>>> newrooms[1]
['5 10.30-12pm', 'MR252 (30)']

您可以使用
str.join
str.split
操作每个子列表中的每个字符串,而不是将列表转换为字符串:

l = [['4      11-12pm', 'MR252 (30)'], ['5      10.30-12pm', 'MR252 (30)'], ['8      10-11am', 'MR252 (30)'], ['9      11-12pm', 'MR252 (30)'], ['10      10-11am', 'MR252 (30)'], ['10      11-12pm', 'MR251 (22)'], ['12      10-11am', 'MR107 (63)'], ['12      11-12pm', 'MR252 (30)'], ['17      10-11am', 'MR252 (30)'], ['18      11-12pm', 'MR252 (30)'], ['19      10-11am', 'MR252 (30)'], ['19      11-12pm', 'MR265 (24)'], ['20      10-11am', 'CB203 (26)'], ['20      11-12pm', 'MR252 (30)'], ['27      10-11am', 'MR252 (30)'], ['28      11-12pm', 'MR252 (30)'], ['29      10-11am', 'MR252 (30)'], ['42      11-12pm', 'MR252 (30)'], ['42       2-4pm                MA ONLY', 'MR252 (30)'], ['43      10-11am', 'MR252 (30)'], ['44      10-11am', ''], ['44      11-12pm', 'MR252 (30)']]

l[:] = [[" ".join(s.split()) for s in sub] for sub in l]

from pprint import  pprint as pp
输出将是一个列表:

[['4 11-12pm', 'MR252 (30)'],
 ['5 10.30-12pm', 'MR252 (30)'],
 ['8 10-11am', 'MR252 (30)'],
 ['9 11-12pm', 'MR252 (30)'],
 ['10 10-11am', 'MR252 (30)'],
 ['10 11-12pm', 'MR251 (22)'],
 ['12 10-11am', 'MR107 (63)'],
 ['12 11-12pm', 'MR252 (30)'],
 ['17 10-11am', 'MR252 (30)'],
 ['18 11-12pm', 'MR252 (30)'],
 ['19 10-11am', 'MR252 (30)'],
 ['19 11-12pm', 'MR265 (24)'],
 ['20 10-11am', 'CB203 (26)'],
 ['20 11-12pm', 'MR252 (30)'],
 ['27 10-11am', 'MR252 (30)'],
 ['28 11-12pm', 'MR252 (30)'],
 ['29 10-11am', 'MR252 (30)'],
 ['42 11-12pm', 'MR252 (30)'],
 ['42 2-4pm MA ONLY', 'MR252 (30)'],
 ['43 10-11am', 'MR252 (30)'],
 ['44 10-11am', ''],
 ['44 11-12pm', 'MR252 (30)']]

遇到这种情况时,请使用
键入
,查看是否有任何变化。当你应用正则表达式时,列表变成一个字符串……因为它不是一个列表?@Hugo更具体地说,当OP应用
str(newrooms)
时,它变成一个字符串……
re.sub
返回一个字符串。字符串是一个字符列表,所以它就像一个listHugo,你是对的。。。我一直在使用pycharm,应该关注变量。。如果我这样做,这是很明显的。
[['4 11-12pm', 'MR252 (30)'],
 ['5 10.30-12pm', 'MR252 (30)'],
 ['8 10-11am', 'MR252 (30)'],
 ['9 11-12pm', 'MR252 (30)'],
 ['10 10-11am', 'MR252 (30)'],
 ['10 11-12pm', 'MR251 (22)'],
 ['12 10-11am', 'MR107 (63)'],
 ['12 11-12pm', 'MR252 (30)'],
 ['17 10-11am', 'MR252 (30)'],
 ['18 11-12pm', 'MR252 (30)'],
 ['19 10-11am', 'MR252 (30)'],
 ['19 11-12pm', 'MR265 (24)'],
 ['20 10-11am', 'CB203 (26)'],
 ['20 11-12pm', 'MR252 (30)'],
 ['27 10-11am', 'MR252 (30)'],
 ['28 11-12pm', 'MR252 (30)'],
 ['29 10-11am', 'MR252 (30)'],
 ['42 11-12pm', 'MR252 (30)'],
 ['42 2-4pm MA ONLY', 'MR252 (30)'],
 ['43 10-11am', 'MR252 (30)'],
 ['44 10-11am', ''],
 ['44 11-12pm', 'MR252 (30)']]