2016-03-19 7 views
2

Ich habe eine Liste, die ich auf gebrauchten regex die Räume in Strings in der Liste zu entfernen, die perfekt funktioniert -Was ist der Unterschied in zwei Listen?

newrooms = re.sub(r'\s+', " ", str(newrooms)) 

die ursprüngliche Liste sieht aus wie -

[['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)']] 

Druck newrooms [3] druckt ... "[ '9 11-12pm', 'MR252 (30)']"

nach dem re.sub mit den Räumen der Liste sieht wie

[['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)']] 
entfernen

seine genau das gleiche (minus die Räume), aber = jetzt

Druck newrooms [3] druckt ... "4"

die alle hier Code

print newrooms[3] 
print newrooms 
newrooms = re.sub(r'\s+', " ", str(newrooms)) 
print newrooms[3] 
print newrooms 

= Warum das tut Liste jetzt nicht wie eine Liste handeln?

OK Jungs, ich sehe, ich war die ganze Liste in einen String mit str (newrooms) Umwandeln, was i ..

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

Wenn Sie auf diese Art von Situationen stoßen, verwenden Sie "type", um zu sehen, ob sich etwas ändert. Wenn Sie Ihre Regex anwenden, wird die Liste stattdessen eine Zeichenfolge. – Deusdeorum

+0

... weil es ** keine Liste ist? ** – jonrsharpe

+2

@Hugo genauer gesagt, wenn das OP 'str (newrooms) anwendet 'wird es eine Zeichenkette ... –

Antwort

4

Nach

newrooms = re.sub(r'\s+', " ", str(newrooms)) 

newrooms tun sollten, früher eine list(), wird eine Zeichenfolge.

print newrooms[3] 

druckt das vierte Zeichen in dieser Zeichenfolge. Python ist ein Ducktyp von Variablen, so dass sich jede Variable flexibel an das anpasst, was Sie darin speichern.

1

Sie wandeln die listnewrooms zu einem einzigen String in dieser Zeile:

newrooms = re.sub(r'\s+', " ", str(newrooms)) 

So ist es nicht mehr nur eine Zeichenfolge und keine Liste ist. Was Sie tun möchten, ist die Substitution an den einzelnen Elementen der Liste anwenden:

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

Daraus ergibt sich:

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

Es gibt unerwartetes Ergebnis, da Sie die Liste der Zeichenfolge konvertieren, bevor ersetzen. Versuchen Sie stattdessen:

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] 
1

Was Sie wollen Sequenzen wiederholt Leerzeichen ist für jede Zeichenfolge in einer Listen von Listen mit einem einzigen Zuschnitt zu ersetzen.

Was Sie tatsächlich tun, ist die Liste in eine Zeichenfolge konvertieren und dann die Substitution durchführen.

Hier ist, was passiert - ich eine verkürzte Version der ursprünglichen Liste zur besseren Lesbarkeit verwenden:

>>> 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' 

Wie Sie sehen können, können Sie eine Zeichenfolge an re.sub sind vorbei, die einen String zurückgibt. Das vierte Zeichen dieser Zeichenfolge ist das Zeichen '4', das Sie sehen, wenn Sie newrooms_str[3] tun.

Um das gewünschte Ergebnis zu erhalten, müssen Sie sich auf den einzelnen Strings in der Liste der Listen bedienen:

>>> 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)'] 
1

Sie in jeder Teilliste verwenden können str.join und str.split auf jeder Saite Betrieb nicht konvertieren die Liste in einen String:

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 

Output wird eine Liste sein:

[['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)']] 
Verwandte Themen