2016-09-21 47 views
0

假設我有一個名爲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()])) 

實際上,我覺得我問我怎麼可以自動轉換到strlist名單是單個字符的元素。

回答

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) 
+0

這不會通過測試用例'joint_support('apple',rows)',它應該返回'5'。我認爲這是因爲第一個'set'語句將''apple''變成'{'p','a','e','l'}'。 – blacksite

+0

@ GBR24您必須將第一個參數設置爲包含一個元素的列表。我已更新我的帖子。 – nauer

+0

我知道,但我寧願只是通過'str',例如「apple」與「list」,例如'['apple']' – blacksite

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}) 
+0

我的意圖不能在上面完全傳達。我想要'items'參數,我想通過一個單獨的'str',例如「apple」或「list」,例如'['apple','banana']',這個函數。該方式的功能當前工作,如果我通過'str',它會通過遍歷字符串(了'在items'部分項目),而不是通過長度爲1的'list'與傳遞的字符串作爲唯一的搜索元件。 – blacksite

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 

計算所有合資項目,而不是遏制其中任何,在elif塊與all取代any

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(" "))])