如何在列表列表中查找值的频率并按公共值与另一个现有列表组合?

How to find frequency of values in a list of lists and combine with another existing list by common value?

我有一个由用户输入组成的嵌套音乐艺术家列表,比方说:

artists_list = [['A', 'B', 'C'],
                ['A', 'C', 'B'],
                ['B', 'A', 'D']]

我还设法根据输入顺序(不是按字母顺序)创建了一个单独的列表,该列表为上面列表中的每个独特艺术家分配了一个流派:

artist_genre_list = [['A', 'Rock'],
                     ['B', 'Rap'],
                     ['C', 'Rock'],
                     ['D', 'Blues']]

如何将这两者结合起来制作主列表或字典,包括类似于以下内容的频率计数:

master_list = [['A', 'Rock', 3],
               ['B', 'Rap', 3],
               ['C', 'Rock', 2],
               ['D', 'Blues', 1]]

master_dict = {'A': {
                  'Genre': 'Rock',
                  'Frequency': 3},
               'B': {
                  'Genre': 'Rap',
                  'Frequency': 3},
               'C': {
                  'Genre': 'Rock',
                  'Frequency': 2},
               'D': {
                  'Genre': 'Blues',
                  'Frequency': 1}
               }

顺序不一定要按字母顺序排列。这是我为创建前两个列表所做的示例:

# Counters
count = 1
new_artist_counter = 0

# Generate Lists
artists_input_list = []
aux_artists_list = []
aux_genre_list = []
aux_artists_genre_list = []

def merge(aux_artists_list, aux_genre_list):
    merged_list = [[aux_artists_list[i], aux_genre_list[i]] for i in range(0, 
                    len(aux_artists_list))]
    return merged_list

while count < 4:

    # Inputs
    a1_in = str(input("Artist 1: "))
    a2_in = str(input("Artist 2: "))
    a3_in = str(input("Artist 3: "))

    artists_input_list.append([a1_in, a2_in, a3_in])

    # Determines if new unique artist has been added and asks for it's genre
    while new_artist_counter < len(artists_input_list):

        for entry in artists_input_list:

             for artist in entry:

                 if artist not in aux_artists_list:
                     aux_artists_list.append(artist)
                     genre_input = input("What is "+artist+"'s genre? ")
                     aux_genre_list.append(genre_input)
                 else: continue

        new_artist_counter += 1  

    aux_artists_genre_list = merge(aux_artists_list, aux_genre_list)

    # Counter updates
    count += 1

print(artists_input_list)
print(aux_artists_genre_list)

这是我想到的。它首先展平您的艺术家列表,获取列表中每个项目的频率,然后将其与您的 genre 列表

合并
from itertools import groupby, chain
import pprint

artists_list = [
  ['A', 'B', 'C'],
  ['A', 'C', 'B'],
  ['B', 'A', 'D']
]

artist_genre_list = [
  ['A', 'Rock'],
  ['B', 'Rap'],
  ['C', 'Rock'],
  ['D', 'Blues']
]

frequencies = {
  key: len(list(value)) for key,
  value in groupby(sorted(chain.from_iterable(artists_list)))
}

frequency = [{
    letter: {
      'Genre': genre,
      'Frequency': next((freq
        for key, freq in frequencies.items() if key is letter), 0)
    }
  }
  for letter, genre in artist_genre_list
]

pprint.pprint(frequency)

我使用pprint只是为了使输出更整洁,显示为

[{'A': {'Frequency': 3, 'Genre': 'Rock'}},
 {'B': {'Frequency': 3, 'Genre': 'Rap'}},
 {'C': {'Frequency': 2, 'Genre': 'Rock'}},
 {'D': {'Frequency': 1, 'Genre': 'Blues'}}]