2017-10-13 58 views
-1

我会尽我所能地尝试和解释我的情况。列表清单并将其与另一个清单关联

我有一个包含名称

name_list = ["Bob" , "Henry" , "Jeff" , "Harry"] 

并包含数字

number_list = ["1,4,2,3" , "4,3,1,2" , "3,2,4,1" , "1,2,3,4" , "4,3,2,1" , "1,2,4,3"] 

我竭力拿出这将创造各种各样,这将关联的理货代码另一个列表中的一个列表每个名称在name_list中具有其对应位置

即,

"result" = Bob - 1:3 , 2:0 , 3:1 , 4:2 
      Henry- 1:0 , 2:3 , 3:2 , 4:1 
      Jeff - 1:1 , 2:2 , 3:1 , 4:2 
      Harry- 1:2 , 2:1 , 3:2 , 4:1 

这实际上可以实现吗?因为我认为我现在已经有一段时间了,我需要绝望的帮助。我对这段代码的思考过程是统计出现的每个数字的出现次数,然后(因为这个代码用于即时径流投票系统)决定谁拥有最高的1次计数,依此类推。

这是一个即时径流投票代码的一部分和关于如果我在正确的轨道上是非常可取

+0

我认为“没有什么是不可能的”。 – SteveFest

回答

0

你可以尝试这方面的消息:

name_list = ["Bob" , "Henry" , "Jeff" , "Harry"] 
number_list = ["1,4,2,3" , "4,3,1,2" , "3,2,4,1" , "1,2,3,4" , "4,3,2,1" , "1,2,4,3"] 
new_number_list = [list(map(int, i.split(","))) for i in number_list] 
final_data = {a:{c:sum(d[i] == c for d in [e for e in new_number_list if e != a]) for c in new_number_list[i]} for i, a in enumerate(name_list)} 

输出:

{'Bob': {1: 3, 2: 0, 3: 1, 4: 2}, 'Jeff': {1: 1, 2: 2, 3: 1, 4: 2}, 'Harry': {1: 2, 2: 1, 3: 2, 4: 1}, 'Henry': {1: 0, 2: 3, 3: 2, 4: 1}} 

编辑:保持所有值的排序,你可以使用这个:

new_final_data = {a:sorted(b.items(), key=lambda x:x[0]) for a, b in final_data.items()} 

输出:

{'Henry': [(1, 0), (2, 3), (3, 2), (4, 1)], 'Bob': [(1, 3), (2, 0), (3, 1), (4, 2)], 'Harry': [(1, 2), (2, 1), (3, 2), (4, 1)], 'Jeff': [(1, 1), (2, 2), (3, 1), (4, 2)]} 
+0

感谢您的回复! 我的意思是我的问题是,在new_final_data中,我想要在number_list中的位置0处出现1的实例,然后在number_list中的位置0处出现2个实例...等 然后重复该位置1 for number_list出现1等。 –

+0

@HY所以你想要在number_list中的每个数字中的每个数字出现在其当前位置的次数? – Ajax1234

+0

是的!这正是我的意思。如果可能的话,你可以做到没有任何导入的功能? –

0

这里是我会怎么做,我不知道,如果你需要一个功能,因为你没有指定

from collections import Counter 
from itertools import chain 

# first lets create a list of dictionaries mapping each name to a number 
maps = [dict(zip(name_list, chunk.split(','))) for chunk in number_list] 

[{'Bob': '1', 'Harry': '3', 'Henry': '4', 'Jeff': '2'}, 
{'Bob': '4', 'Harry': '2', 'Henry': '3', 'Jeff': '1'}, 
{'Bob': '3', 'Harry': '1', 'Henry': '2', 'Jeff': '4'}, 
{'Bob': '1', 'Harry': '4', 'Henry': '2', 'Jeff': '3'}, 
{'Bob': '4', 'Harry': '1', 'Henry': '3', 'Jeff': '2'}, 
{'Bob': '1', 'Harry': '3', 'Henry': '2', 'Jeff': '4'}] 

for name in name_list: 
    temp = Counter() 
    # counter object where name is the key, value is another counter object 
    temp.update({name: Counter(map(lambda x: x.get(name), maps))}) 
    num = len(temp.values()[0].keys()) 
    # create string to format 
    fmt = '{} has {} occurences, ' * num 
    print '{} - '.format(name) + fmt.format(*list(chain.from_iterable(temp.values()[0].items()))) 

Bob - 1 has 3 occurences, 3 has 1 occurences, 4 has 2 occurences, 
Henry - 3 has 2 occurences, 2 has 3 occurences, 4 has 1 occurences, 
Jeff - 1 has 1 occurences, 3 has 1 occurences, 2 has 2 occurences, 4 has 2 occurences, 
Harry - 1 has 2 occurences, 3 has 2 occurences, 2 has 1 occurences, 4 has 1 occurences,