我有一个看起来像这样的列表,
lista = ['hello','2','go','5','sit','4','line','3','sit','2', 'go','9','play','0']
在此列表中,单词后面的每个数字代表单词的值。我想在字典中表示此列表,以便添加每个重复单词的值。我希望字典是这样的:
dict = {'hello':'2', 'go':'14', 'sit':'6','line':'3','play':'0'}
在列表中' go'出现两次有两个不同的值,所以我们添加在单词之后出现的数字,类似于其他单词。 这是我的方法,它似乎不起作用。
import csv
with open('teest.txt', 'rb') as input:
count = {}
my_file = input.read()
listt = my_file.split()
i = i + 2
for i in range(len(listt)-1):
if listt[i] in count:
count[listt[i]] = count[listt[i]] + listt[i+1]
else:
count[listt[i]] = listt[i+1]
答案 0 :(得分:2)
defaultdict
通常可以计算唯一键的出现次数。
import collections as ct
lista = ['hello','2','go','5','sit','4','line','3','sit','2', 'go','9','play','0']
dd = ct.defaultdict(int)
iterable = iter(lista)
for word in iterable:
dd[word] += int(next(iterable))
dd
# defaultdict(int, {'go': 14, 'hello': 2, 'line': 3, 'play': 0, 'sit': 6})
这里我们初始化defaultdict
以接受整数。我们创建一个列表迭代器,它们都创建了一个生成器,并允许我们在其上调用next()
。由于单词和值出现在列表中的连续对中,我们将迭代并立即调用next()
以同步提取这些值。我们将(key, value)
对的这些项目分配给defaultdict
,这恰好会保持计数。
如果需要,将整数转换为字符串:
{k: str(v) for k, v in dd.items()}
# {'go': '14', 'hello': '2', 'line': '3', 'play': '0', 'sit': '6'}
备用工具可能是Counter
(参见@ DexJ的答案),它与此类defaultdict
有关。实际上,Counter()
可以在此处替换defaultdict(int)
并返回相同的结果。
答案 1 :(得分:1)
您可以使用range()一次“跨步”数组2项。范围中的可选第3个参数允许您定义“跳过”。
范围(开始,停止[,步骤])
使用这个,我们可以创建一系列索引,在列表的整个长度上一次跳过2个索引。然后,我们可以向列表询问该索引lista[i]
处的“名称”以及lista[i + 1]
之后的“值”。
new_dict = {}
for i in range(0, len(lista), 2):
name = lista[i]
value = lista[i + 1]
# the name already exists
# convert their values to numbers, add them, then convert back to a string
if name in new_dict:
new_dict[name] = str( int(new_dict[name]) + int(value) )
# the name doesn't exist
# simply append it with the value
else:
new_dict[name] = value
答案 2 :(得分:0)
正如@Soviut所解释的那样,您可以使用range()
函数与步长值2直接达到单词。正如我在你的列表中看到的那样,你将值存储为字符串,所以我将它们转换为整数。
lista = ['hello','2','go','5','sit','4','line','3','sit','2', 'go','9','play','0']
data = {}
for i in range(0, len(lista), 2): # increase searching with step of 2 from 0 i.e. 0,2,4,...
if lista[i] in data.keys(): # this condition checks whether your element exist in dictionary key or not
data[lista[i]] = int(data[lista[i]]) + int(lista[i+1])
else:
data[lista[i]] = int(lista[i+1])
print(data)
{'hello': 2, 'go': 14, 'sit': 6, 'line': 3, 'play': 0}
答案 3 :(得分:0)
使用iter()
,itertools.zip_longest()
和itertools.groupby()
函数的另一种解决方案:
import itertools
lista = ['hello','2','go','5','sit','4','line','3','sit','2', 'go','9','play','0']
it = iter(lista)
d = {k: sum(int(_[1]) for _ in g)
for k,g in itertools.groupby(sorted(itertools.zip_longest(it, it)), key=lambda x: x[0])}
print(d)
输出:
{'line': 3, 'sit': 6, 'hello': 2, 'play': 0, 'go': 14}
答案 4 :(得分:0)
lista = ['hello','2','go','5','sit','4','line','3','sit','2', 'go','9','play','0']
dictionary = {}
for keyword, value in zip(*[iter(lista)]*2): # iterate two at a time
if keyword in dictionary: # if the key is present, add to the existing sum
dictionary[keyword] = dictionary[keyword] + int(value)
else: # if not present, set the value for the first time
dictionary[keyword] = int(value)
print(dictionary)
输出:
{'hello': 2, 'go': 14, 'sit': 6, 'line': 3, 'play': 0}
答案 5 :(得分:0)
您可以使用范围(开始,结束,步骤)来获取端点和拆分列表,只需使用计数器()来自集合< strong>将重复键的值加起来,您就完成了:)
这里 yourdict 将{'go':14,'line':3,'sit':6,'play':0,'hello':2}
from collections import Counter
counter_obj = Counter()
lista = ['hello','2','go','5','sit','4','line','3','sit','2', 'go','9','play','0']
items, start = [], 0
for end in range(2,len(lista)+2,2):
print end
items.append(lista[start:end])
start = end
for item in items:
counter_obj[item[0]] += int(item[1])
yourdict = dict(counter_obj)
print yourdict