尝试在不使用集合的情况下计算以下列表中的唯一值:
('TOILET':2,'AIR CONDITIONiNGS':3)
我需要的输出是:
for i in Data:
if i in number:
number[i] += 1
else:
number[i] = 1
print number
我的代码目前是
{{1}}
是否可以获得输出?
答案 0 :(得分:0)
original = ('TOILETS', 'TOILETS', 'AIR CONDITIONING',
'AIR-CONDITIONINGS', 'AIR-CONDITIONING')
a_set = set(original)
result_dict = {element: original.count(element) for element in a_set}
首先,从原始列表(或元组)创建一个集合可以为您提供所有值,但不会重复。
然后使用count()
方法,使用原始列表(或元组)中的键创建一个字典,并将值作为它们的出现值创建
答案 1 :(得分:0)
你可以试试这个:
import re
data = ('TOILETS','TOILETS','AIR CONDITIONING','AIR-CONDITIONINGS','AIR-CONDITIONING')
new_data = [re.sub("\W+", ' ', i) for i in data]
print new_data
final_data = {}
for i in new_data:
s = [b for b in final_data if i.startswith(b)]
if s:
new_data = s[0]
final_data[new_data] += 1
else:
final_data[i] = 1
print final_data
输出:
{'TOILETS': 2, 'AIR CONDITIONING': 3}
答案 2 :(得分:0)
我不相信python列表有一个简单的内置方式来做你要求的。但是,它有一个count方法,可以告诉你列表中有多少特定元素。例如:
some_list = ['a', 'a', 'b', 'c']
some_list.count('a') #=> 2
通常你得到你想要的方法是利用Hash :: get(key,default)方法构造一个可递增的哈希:
some_list = ['a', 'a', 'b', 'c']
counts = {}
for el in some_list
counts[el] = counts.get(el, 0) + 1
counts #=> {'a' : 2, 'b' : 1, 'c' : 1}
答案 3 :(得分:0)
a = ['TOILETS', 'TOILETS', 'AIR CONDITIONING', 'AIR-CONDITIONINGS', 'AIR-CONDITIONING']
b = {}
for i in a:
b.setdefault(i,0)
b[i] += 1
您可以使用此代码,但与Jon Clements的谈话,TOILET和TOILETS相同的字符串不一样,您必须确保它们。
答案 4 :(得分:0)
使用difflib.get_close_matches来帮助确定唯一性
import difflib
a = ('TOILET','TOILETS','AIR CONDITIONING','AIR-CONDITIONINGS','AIR-CONDITIONING')
d = {}
for word in a:
similar = difflib.get_close_matches(word, d.keys(), cutoff = 0.6, n = 1)
#print(similar)
if similar:
d[similar[0]] += 1
else:
d[word] = 1
字典中的实际键取决于列表中单词的顺序。
difflib.get_close_matches
使用difflib.SequenceMatcher
计算单词与所有可能性的亲密度(比率),即使第一种可能性是 close - 然后按比例排序。这样做的好处是找到比率大于截止值的最接近的键。但随着字典的增长,搜索需要更长的时间。
如果需要,您可以通过首先对列表进行排序来优化一点,以便类似的单词按顺序出现并执行类似的操作(延迟评估) - 选择适当大的截止值。< / p>
import difflib, collections
z = collections.OrderedDict()
a = sorted(a)
cutoff = 0.6
for word in a:
for key in z.keys():
if difflib.SequenceMatcher(None, word, key).ratio() > cutoff:
z[key] += 1
break
else:
z[word] = 1
结果:
>>> d
{'TOILET': 2, 'AIR CONDITIONING': 3}
>>> z
OrderedDict([('AIR CONDITIONING', 3), ('TOILET', 2)])
>>>
我想有些python包可以做这种事情并且可以进行优化。