从列表

时间:2018-04-12 09:05:38

标签: python string list substring list-comprehension

我坚持这几个小时: 我有一个名为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

3 个答案:

答案 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的答案重复了这个...