如何从大数据中标准化列表中元素的格式

时间:2017-10-14 15:12:33

标签: python

尝试在不使用集合的情况下计算以下列表中的唯一值:

('TOILET':2,'AIR CONDITIONiNGS':3)

我需要的输出是:

for i in Data:
    if i in number:
        number[i] += 1
    else:
        number[i] = 1
print number

我的代码目前是

{{1}}

是否可以获得输出?

5 个答案:

答案 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包可以做这种事情并且可以进行优化。