假设我有一个名为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
而不将列表中的元素作为单个字符。
答案 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(" "))])