Как создать словарь из нескольких списков строк? - PullRequest
0 голосов
/ 12 мая 2019

Я хочу создать словарь из списка строк.Например, у меня есть эти списки

AAAA
AAAA
AAAA
BBBB
BBBB
CCCC
CCCC
CCCC
....

Затем я хочу создать словарь со значением нумерации, как это сделать?

Я изучил некоторый код, но до сих пор не знаю

import os
path = "directoryA"
dirList = os.listdir(path)


with open("check.txt", "w") as a:
    for path, subdirs, files in os.walk(path):
        for filename in files:
            # I have splitted the text and now I want to create dictionary 
            #from it

            mylist = filename.split("_") # the text format is AAAA_0 and I split 
                                         #it so I can have list of 'AAAA' and '0'

            k = mylist[0] #I only take 'AAAA' string after splitting
            print(k) # here the output only give text output. From this I want to 
                     # put into dictionary            

Этоявляется выводом после печати (k), и это не список

AAAA
AAAA
AAAA
BBBB
BBBB
CCCC
CCCC
CCCC
....

Это мой ожидаемый результат

myDic ={
    'AAAA': 0,
    'BBBB': 1,
    'CCCC': 2,
    'DDDD': 3,
    # ... and so on
}

Ответы [ 6 ]

2 голосов
/ 12 мая 2019

Предполагая, что содержимое check.txt выглядит как li, начните с получения всех уникальных элементов в списке строк, используя набор, а затем отсортируйте уникальный список по алфавиту

После этого используйте словарьпонимание и enumerate для создания вашего словаря

li = [
    "AAAA",
    "AAAA",
    "AAAA",
    "BBBB",
    "BBBB",
    "CCCC",
    "CCCC",
    "CCCC"]

#Get the list of unique strings by converting to a set
li = (list(set(li)))

#Sort the list lexicographically
li = sorted(li)

#Create your dictionary via dictionary comprehension and enumerate
dct =  {item:idx for idx, item in enumerate(li)}
print(dct)

Вывод будет

{'AAAA': 0, 'BBBB': 1, 'CCCC': 2}

Мы должны быть в состоянии создать список строк li примерно так

import os
path = "directoryA"
dirList = os.listdir(path)
li = []

with open("check.txt", "w") as a:
    for path, subdirs, files in os.walk(path):
        for filename in files:
            # I have splitted the text and now I want to create dictionary 
            #from it

            mylist = filename.split("_") # the text format is AAAA_0 and I split 
                                         #it so I can have list of 'AAAA' and '0'

            k = mylist[0] 
            #append item to li
            li.append(k) 
1 голос
/ 12 мая 2019

Вы можете использовать dict.fromkeys(), чтобы построить dict и count(), чтобы заполнить значения:

from itertools import count

lst = ["AAAA", "AAAA", "AAAA", "BBBB", "BBBB", "CCCC", "CCCC", "CCCC"]

dct = dict.fromkeys(lst)
c = count()

for key in dct:
    dct[key] = next(c)

print(dct)
# {'AAAA': 0, 'BBBB': 1, 'CCCC': 2}
1 голос
/ 12 мая 2019

Вы можете использовать itertools.groupby для группировки строк, предполагая, что они отсортированы так, как они есть у вас (нет, сначала отсортируйте их).Затем enumerate() по группам, которые дадут вам счет:

from itertools import groupby
l = [
    "AAAA", 
    "AAAA", 
    "AAAA", 
    "BBBB",
    "BBBB",
    "CCCC",
    "CCCC",
    "CCCC"]

d = {key:i for i, (key, group) in enumerate(groupby(l))}
# {'AAAA': 0, 'BBBB': 1, 'CCCC': 2}

Если вы читаете из файла, а строки не отсортированы, вы можете добавить запись и приращениекаждый раз, когда вы найдете что-то еще не в диктанте.Значения будут отсортированы по первому разу, когда вы увидите заданную строку.Например:

from itertools import count, filterfalse

i = count(1)
d = {}

with open('test.txt') as f:
    for line in filterfalse(lambda l: l.strip() in d, f):
        d[line.strip()] = next(i)
0 голосов
/ 12 мая 2019

сначала вы должны удалить дубликаты на основе этого ответа: Как удалить дубликаты из списка при сохранении порядка?

так будет и так:

def f7(seq):
    seen = set()
    seen_add = seen.add
    return [x for x in seq if not (x in seen or seen_add(x))]

l = [
"AAAA", 
"AAAA", 
"AAAA", 
"BBBB",
"BBBB",
"CCCC",
"CCCC",
"CCCC"]

#first remove duplicates
s = f7(l)

#create desired dict
dict(zip(s,range(len(s))))
#{'AAAA': 0, 'CCCC': 1, 'BBBB': 2}
0 голосов
/ 12 мая 2019

Я бы сделал это следующим образом:

data = ['A','A','A','B','B','C','C','D','C']
unique = [i for inx,i in enumerate(data) if data.index(i)==inx]
print(unique) # ['A', 'B', 'C', 'D']
d = {(i,inx) for inx,i in enumerate(unique)}
print(d) # {('D', 3), ('A', 0), ('B', 1), ('C', 2)}

Идея этого метода может быть описана следующим образом: получить значение из списка только в том случае, если оно встречается впервые (то же значение ранее не появлялось).Я использовал тот факт, что .index метод list всегда возвращает минимально возможное значение.Обратите внимание, что в этом методе одни и те же значения не обязательно должны быть соседями.

0 голосов
/ 12 мая 2019

Предполагается, что ключи словаря:

keys = ['A', 'B', 'C']

Тогда:

id = range(len(keys))
d = dict(zip(keys, id))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...