将字符串转换为列表而元素不是单个字符?

时间:2016-09-21 12:53:55

标签: python string

假设我有一个名为support的函数,它计算项目在列表中元素中出现的次数:

>>> rows = ['candy apple banana cookie', 'candy apple banana', 'candy', 'apple', 'apple banana candy', 'candy apple', 'banana']

>>> def support(item, rows):
        return float(sum([1 for row in rows if item in row]))

>>> print(support('apple', rows))
5.0

效果很好,但最终我需要衡量两个项在数据中出现的频率。我可以定义这样的东西:

>>> def joint_support(items, rows):
        return float(sum([1 for row in rows if all(item in row.split() for item in items)]))

我宁愿不定义两个有效地做同样事情的函数。无论用户是否在items中传递了一个或两个元素,我都希望函数能够在数据中统一计算这些项目的出现次数。不使用if语句来测量items的长度(即使用列表推导),如果items参数只是一个字符串,我怎样才能确保该函数不搜索每个字母的联合出现?

这是我到目前为止所做的:

>>> def master_support(items, rows):
return float(sum([1 for row in rows if all(item in row.split() for item in items if type(items) is not str) else 1 if items in row.split()]))

实际上,我想我是在问我如何自动将str转换为list而不将列表中的元素作为单个字符。

4 个答案:

答案 0 :(得分:1)

您实际上已经找到了如何将str转换为list而不将元素作为单个字符:row.split()。你的问题是,这会给你留下一堆小的列表(比如['candy', 'apple', 'banana', 'cookie']),而不是将所有列表展平成一个很容易计算的长列表。为此,你可以像我一样使用itertools.chain():

>>> from collections import Counter
>>> import itertools
>>>
>>> rows = ['candy apple banana cookie', 'candy apple banana', 'candy', 'apple', 'apple banana candy', 'candy apple', 'banana']
>>> words_list = list(itertools.chain(*[phrase.split() for phrase in rows]))
>>> word_counts = Counter(words_list)
>>> print(words_list)
['candy', 'apple', 'banana', 'cookie', 'candy', 'apple', 'banana', 'candy', 'apple', 'apple', 'banana', 'candy', 'candy', 'apple', 'banana']
>>> print(word_counts)
Counter({'apple': 5, 'candy': 5, 'banana': 4, 'cookie': 1})

答案 1 :(得分:1)

如果我理解你,你正在寻找类似的东西

def joint_support(items, rows):
    return sum([1 for row in rows if set(items).issubset(set(row.split()))])

第二个set是可选的

rows = ['candy apple banana cookie', 'candy apple banana', 'candy', 'apple', 'apple banana candy', 'candy apple', 'banana']
rows2 = ['candy apple banana cookie']
items = ['apple', 'banana']

joint_support(items, rows)
joint_support(items, rows2)

答案 2 :(得分:1)

传递项目列表时,在参数中添加一个前导星号,因此列表被视为单独项目的容器:

def joint_support(rows, *items):
    if len(items) == 1:
        return float(sum(items[0] in row for row in rows))
    elif len(items) > 1:
        return float(sum(any(r in row for r in items) for row in rows))


rows = ['candy apple banana cookie', 'candy apple banana', 'candy', 'apple', 'apple banana candy', 'candy apple', 'banana']

print(joint_support(rows, 'apple')) # 5.0

# add a leading asterisk
print(joint_support(rows, *['apple', 'boy', 'banana'])) # 6.0

要计算对所有联合项目的包含,而不是任何,请将any替换为all块中的elif

答案 3 :(得分:0)

如果您只想查看列表中是否存在所有项目,可以使用set并将其减去。

def joint_support(item, rows):
    if isinstance(item, str):
        item = (item,)
    return float(sum[1 for row in rows if not set(item)-set(row.split(" "))])