我坚持这几个小时:
我有一个名为size_col
的系列,包含887个元素,我想从大小中检索S, M, L, XL
。我尝试了两种不同的方法,列表理解和一个简单的if elif
循环,但两种尝试都不起作用。
sizes = ['S', 'M', 'L', 'XL']
tshirt_sizes = []
[tshirt_sizes.append(i) for i in size_col if i in sizes]
第二次尝试:
sizes = []
for i in size_col:
if len(i) < 15:
sizes.append(i.split(" / ",1)[-1])
else:
sizes.append(i.split(" - ",1)[-1])
我创建了两个条件,因为在某些情况下,大小遵循' - '
,而在其他情况下,大小是'/'
。
老实说我不知道怎么处理。
列表示例:
T-Shirt Donna "Si dai. Ciao." - M
T-Shirt Donna "Honey" - L
T-Shirt Donna "Si dai. Ciao." - M
T-Shirt Donna "I do very bad things" - M
T-Shirt Donna "Si dai. Ciao." - M
T-Shirt Donna "Stai nel tuo (mind your business)" - White / S
T-Shirt Donna "Stay Stronz" - White / L
T-Shirt Donna "Stay Stronz" - White / M
T-Shirt Donna "Si dai. Ciao." - S
T-Shirt Donna "Je suis esaurit" - Black / S
T-Shirt Donna "Si dai. Ciao." - S
T-Shirt Donna "Teamo - Tequila" - S / T-Shirt
答案 0 :(得分:3)
这里你需要regular expressions。预编译正则表达式模式,然后在列表推导中使用pattern.search
。
sizes = ['S', 'M', 'L', 'XL']
p = re.compile(r'\b({})\b'.format('|'.join(sizes)))
tshirt_sizes = [p.search(i).group(0) for i in size_col]
print(tshirt_sizes)
['M', 'L', 'M', 'M', 'M', 'S', 'L', 'M', 'S', 'S', 'S', 'S']
为了增加安全性,您可能需要一个循环 - 列表推导不适合错误处理:
tshirt_sizes = []
for i in size_col:
try:
tshirt_sizes.append(p.search(i).group(0))
except AttributeError:
tshirt_sizes.append(None)
这里使用正则表达式的唯一原因是适当地处理数据的最后一行。一般来说,如果可以的话,你应该更喜欢使用字符串操作(即str.split
),除非可以避免,它们比基于正则表达式的模式匹配和提取更快更易读。
答案 1 :(得分:0)
你可以这样做:
available_sizes = ["S", "M", "L", "XL"]
sizes = []
for i in size_col:
for w in i.split():
if w in available_sizes:
sizes.append(w)
如果文本多次包含available_sizes中的单词,例如T-Shirt Donna "La S è la più bella consonante" - M
,则不会起作用,因为它会将S和M都添加到列表中。
原始答案,在OP指定之前,大小并不总是最后一个字。
几乎。只需将字符串分成单词并取最后一个字符串。
sizes = []
for i in size_col:
sizes.append(i.split()[-1])
答案 2 :(得分:0)
这个问题有两个方面,1)循环元素的最佳方法和2)分割字符串的正确方法。
在一般情况下,列表推导可能是解决此类问题的正确方法,但您已正确识别正确拆分字符串是非常棘手的。
对于这类问题,regular expressions非常强大,并且(与之前的答案相比,存在使其复杂化的风险),您可以使用以下内容:
import re
pattern = re.compile(r'[-/] (A-Z)$') # select any uppercase letters after either - or / and a space and before the end of the line (marked by $)
sizes = [pattern.search(item).group(1) for item in size_col] # group 1 selects the set of characters in the first set of parentheses (the letters)
编辑:刚刚看到帖子的编辑声明该项目并不总是在最后,而COLDSPEED的答案重复了这个...