Найти - Пользователи
Полная версия: Сортировка словаря и условие
Начало » Python для новичков » Сортировка словаря и условие
1 2 3
py.user.next
То есть просто из ID взять каждую строку. И для каждой строки найти словарь в data с этой строкой и наименьшим значением Position. А draw вообще в поиске не участвует.

Получится список словарей, в которых значения ID соответствуют строкам из списка ID, а значение Position у каждого словаря минимально среди других словарей из data с аналогичной строкой ID.

>>> slst = ['c_gsh_t.Srte6f:tesrs.o/sg', 'g3.erSi3th:12l9PgPr/iit/m', '//aRue-fatriR_teot-9tn_s-', '3/em-r0fninrre-I/rhefrfDe']
>>> 
>>> dlst = [{'Position': '8', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '1'}, {'Position': '1', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '6'}, {'Position': '2', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '2'}, {'Position': '3', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '4'}, {'Position': '4', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '7'}, {'Position': '5', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '5'}, {'Position': '6', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '3'}, {'Position': '7', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '8'}, {'Position': '9', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '9'}, {'Position': '4', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '5'}, {'Position': '2', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '2'}, {'Position': '1', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '3'}, {'Position': '5', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '4'}, {'Position': '6', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '1'}, {'Position': '3', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '6'}, {'Position': '3', 'ID': '3/em-r0fninrre-I/rhefrfDe', 'Draw': '3'}, {'Position': '1', 'ID': '3/em-r0fninrre-I/rhefrfDe', 'Draw': '1'}, {'Position': '2', 'ID': '3/em-r0fninrre-I/rhefrfDe', 'Draw': '2'}, {'Position': '4', 'ID': '3/em-r0fninrre-I/rhefrfDe', 'Draw': '4'}, {'Position': '3', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '5'}, {'Position': '1', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '3'}, {'Position': '2', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '1'}, {'Position': '6', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '2'}, {'Position': '5', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '4'}, {'Position': '4', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '6'}]
>>> 
>>> out = [min((d for d in dlst if d['ID'] == s),
...            key=lambda i: int(i['Position']))
...        for s in slst]
>>> out
[{'Draw': '3', 'Position': '1', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg'}, {'Draw': '3', 'Position': '1', 'ID': 'g3.erSi3th:12l9PgPr/iit/m'}, {'Draw': '6', 'Position': '1', 'ID': '//aRue-fatriR_teot-9tn_s-'}, {'Draw': '1', 'Position': '1', 'ID': '3/em-r0fninrre-I/rhefrfDe'}]
>>>

Если строки нет в словарях, это породит иключение. Ну, я так понял, тебе и не надо проверять это.
paraman
Вы адский кодер
В новый словарь ключик ID можно не включать, а вместо него включить количество ID в данной дате.
У меня в быдлокоде это делалось так len(data_ID)
paraman
py.user.next
То есть просто из ID взять каждую строку. И для каждой строки найти словарь в data с этой строкой и наименьшим значением Position. А draw вообще в поиске не участвует.Получится список словарей, в которых значения ID соответствуют строкам из списка ID, а значение Position у каждого словаря минимально среди других словарей из data с аналогичной строкой ID.

И полностью отсутствует проверка очерёдности ключа draw
В качестве примера изменил значение ключа draw в

dlst = [{'Position': '8', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '10'}

И судя по результату id //aRue-fatriR_teot-9tn_s- есть в итоговой переменной. Хотя длинна словаря с идентичным ID меньше 10.
py.user.next
Сначала продумай всё на словах, а потом пиши код. Чтобы десять разных кодов не писать, которые все делают не то.
paraman
py.user.next
Сначала продумай всё на словах, а потом пиши код. Чтобы десять разных кодов не писать, которые все делают не то.
Тяжело быть новичком.
Но я вроде пытался описать.

Не заполненного draw быть не может. При заполнение стоит проверка, но ему может быть присвоен ошибочный номер.
Для проверки этого я и добавил функцию checkDraw.
paraman
py.user.next
Сначала продумай всё на словах, а потом пиши код. Чтобы десять разных кодов не писать, которые все делают не то.

Прошу прощения, за не оперативный ответ. Был в дороге.
Чтобы точнее меня понять и мою нужду опишу весь процесс полностью.
Есть научный эксперимент по ботанике. Суть эксперимента выяснить влияние температуры на развитие саженцев.
Существуют разные зоны микроклимата, в которых есть разное количество горшков с саженцами.
Эти горшки в словаре они обозначаются по ключу ‘Draw’.
У каждой зоны есть свой ID.
Так вот иногда в значение ключа ‘Draw’ попадает ошибочное значение.
Как пример:

[{'Position': '8', 'Draw': '10', 'ID': '//aRue-fatriR_teot-9tn_s-'}, {'Position': '1', 'Draw': '6', 'ID': '//aRue-fatriR_teot-9tn_s-'}, {'Position': '2', 'Draw': '2', 'ID': '//aRue-fatriR_teot-9tn_s-'}, {'Position': '3', 'Draw': '4', 'ID': '//aRue-fatriR_teot-9tn_s-'}, {'Position': '4', 'Draw': '7', 'ID': '//aRue-fatriR_teot-9tn_s-'}, {'Position': '5', 'Draw': '5', 'ID': '//aRue-fatriR_teot-9tn_s-'}, {'Position': '6', 'Draw': '3', 'ID': '//aRue-fatriR_teot-9tn_s-'}, {'Position': '7', 'Draw': '8', 'ID': '//aRue-fatriR_teot-9tn_s-'}, {'Position': '9', 'Draw': '9', 'ID': '//aRue-fatriR_teot-9tn_s-'}]

Длина данных по ID будет равна 9, а один из ключей ‘Draw’: ‘10’, чего не может быть. Это ошибка.
Собственно нужно пройтись по списку словарей и найти из списка ID совпадения. Затем проверить длину этих совпадений и значений ‘Draw’. Все ‘Draw’ идут от 1 до *. (где * и есть длинна по ID)
Иными словами, проверить климатические зоны на наличие горшков и забрать полученные данные где ‘Position’ = 1.
Как пример:

[{'Position': '3', 'Draw': '5', 'ID': 'g3.erSi3th:12l9PgPr/iit/m'}, {'Position': '1', 'Draw': '3', 'ID': 'g3.erSi3th:12l9PgPr/iit/m'}, {'Position': '2', 'Draw': '1', 'ID': 'g3.erSi3th:12l9PgPr/iit/m'}, {'Position': '6', 'Draw': '2', 'ID': 'g3.erSi3th:12l9PgPr/iit/m'}, {'Position': '5', 'Draw': '4', 'ID': 'g3.erSi3th:12l9PgPr/iit/m'}, {'Position': '4', 'Draw': '6', 'ID': 'g3.erSi3th:12l9PgPr/iit/m'}]

Длина равна 6, и в данном примере есть ‘Draw’: ‘1’, ‘Draw’: ‘2’, ‘Draw’: ‘3’, ‘Draw’: ‘4’, ‘Draw’: ‘5’, ‘Draw’: ‘6’, а, следовательно, сохраняем {'Position': ‘1’, ‘Draw’: ‘3’, ‘ID’: ‘g3.erSi3th:12l9PgPr/iit/m’} и общую длину списка = 6.
В идеале получаем {'Position': ‘1’, ‘Draw’: ‘3’, ‘ID’: ‘g3.erSi3th:12l9PgPr/iit/m’, ‘Total Len’: ‘6’}

Спасибо Вам за терпение и желание помочь.
py.user.next
>>> slst = ['c_gsh_t.Srte6f:tesrs.o/sg', 'g3.erSi3th:12l9PgPr/iit/m', '//aRue-fatriR_teot-9tn_s-', '3/em-r0fninrre-I/rhefrfDe']
>>> 
>>> dlst = [{'Position': '8', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '1'}, {'Position': '1', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '6'}, {'Position': '2', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '2'}, {'Position': '3', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '4'}, {'Position': '4', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '7'}, {'Position': '5', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '5'}, {'Position': '6', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '3'}, {'Position': '7', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '8'}, {'Position': '9', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '9'}, {'Position': '4', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '5'}, {'Position': '2', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '2'}, {'Position': '1', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '3'}, {'Position': '5', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '4'}, {'Position': '6', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '1'}, {'Position': '3', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '6'}, {'Position': '3', 'ID': '3/em-r0fninrre-I/rhefrfDe', 'Draw': '3'}, {'Position': '1', 'ID': '3/em-r0fninrre-I/rhefrfDe', 'Draw': '1'}, {'Position': '2', 'ID': '3/em-r0fninrre-I/rhefrfDe', 'Draw': '2'}, {'Position': '4', 'ID': '3/em-r0fninrre-I/rhefrfDe', 'Draw': '4'}, {'Position': '3', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '5'}, {'Position': '1', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '3'}, {'Position': '2', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '1'}, {'Position': '6', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '2'}, {'Position': '5', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '4'}, {'Position': '4', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '6'}]
>>> 
>>> out = {}
>>> for s in slst:
...     t = tuple(i for i in dlst if i['ID'] == s)
...     lt = len(t)
...     td = (i for i in t if int(i['Draw']) <= lt)
...     m = min(td, key=lambda i: int(i['Position']))
...     out[s] = m, lt
... 
>>> out
{'c_gsh_t.Srte6f:tesrs.o/sg': ({'Position': '1', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '3'}, 6), '3/em-r0fninrre-I/rhefrfDe': ({'Position': '1', 'ID': '3/em-r0fninrre-I/rhefrfDe', 'Draw': '1'}, 4), 'g3.erSi3th:12l9PgPr/iit/m': ({'Position': '1', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '3'}, 6), '//aRue-fatriR_teot-9tn_s-': ({'Position': '1', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '6'}, 9)}
>>>
paraman
py.user.next
Спасибо, что Вы единственный помогаете, но..

slst = ['c_gsh_t.Srte6f:tesrs.o/sg']
dlst = [{'Position': '4', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '50'}, {'Position': '2', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '2'}, {'Position': '1', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '3'}, {'Position': '5', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '4'}, {'Position': '6', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '1'}, {'Position': '3', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '6'}]
out = {}
for s in slst:
    t = tuple(i for i in dlst if i['ID'] == s)
    lt = len(t)
    td = (i for i in t if int(i['Draw']) <= lt)
    m = min(td, key=lambda i: int(i['Position']))
    out[s] = m, lt
print out

Длина данных по ID будет равна 6, а один из ключей ‘Draw’: ‘50’, чего не может быть. Это ошибка.
Ваш код, не отработал эту ошибку и выдал в результат. А должен был ничего не выдавать.
paraman
slst = ['c_gsh_t.Srte6f:tesrs.o/sg', 'g3.erSi3th:12l9PgPr/iit/m', '//aRue-fatriR_teot-9tn_s-', '3/em-r0fninrre-I/rhefrfDe']
dlst = [{'Position': '8', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '100'}, {'Position': '1', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '6'}, {'Position': '2', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '2'}, {'Position': '3', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '4'}, {'Position': '4', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '7'}, {'Position': '5', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '5'}, {'Position': '6', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '3'}, {'Position': '7', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '8'}, {'Position': '9', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '9'}, {'Position': '4', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '5'}, {'Position': '2', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '2'}, {'Position': '1', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '3'}, {'Position': '5', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '4'}, {'Position': '6', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '1'}, {'Position': '3', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '6'}, {'Position': '3', 'ID': '3/em-r0fninrre-I/rhefrfDe', 'Draw': '3'}, {'Position': '1', 'ID': '3/em-r0fninrre-I/rhefrfDe', 'Draw': '1'}, {'Position': '2', 'ID': '3/em-r0fninrre-I/rhefrfDe', 'Draw': '2'}, {'Position': '4', 'ID': '3/em-r0fninrre-I/rhefrfDe', 'Draw': '4'}, {'Position': '3', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '5'}, {'Position': '1', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '3'}, {'Position': '2', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '1'}, {'Position': '6', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '2'}, {'Position': '5', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '4'}, {'Position': '4', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '6'}]
out = {}
for s in slst:
    t = tuple(i for i in dlst if i['ID'] == s)
    lt = len(t)
    td = list(i for i in t if int(i['Draw']) > lt)
    if td == []:
        td = (i for i in t if int(i['Draw']) <= lt)
        m = min(td, key=lambda i: int(i['Position']))
        out[s] = m, lt
print len(out)

Вот так вышло, то что нужно.
py.user.next
paraman
Это ошибка.
Ваш код, не отработал эту ошибку и выдал в результат.

Ты же не сказал, что надо вообще всё отбросить, если хоть одна неправильная. Поэтому я отбрасывал только ту, которая неправильная.

>>> slst = ['c_gsh_t.Srte6f:tesrs.o/sg', 'g3.erSi3th:12l9PgPr/iit/m', '//aRue-fatriR_teot-9tn_s-', '3/em-r0fninrre-I/rhefrfDe']
>>> 
>>> dlst = [{'Position': '8', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '1'}, {'Position': '1', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '6'}, {'Position': '2', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '2'}, {'Position': '3', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '4'}, {'Position': '4', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '7'}, {'Position': '5', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '5'}, {'Position': '6', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '3'}, {'Position': '7', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '8'}, {'Position': '9', 'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '9'}, {'Position': '4', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '5'}, {'Position': '2', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '2'}, {'Position': '1', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '3'}, {'Position': '5', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '4'}, {'Position': '6', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '1'}, {'Position': '3', 'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '6'}, {'Position': '3', 'ID': '3/em-r0fninrre-I/rhefrfDe', 'Draw': '3'}, {'Position': '1', 'ID': '3/em-r0fninrre-I/rhefrfDe', 'Draw': '1'}, {'Position': '2', 'ID': '3/em-r0fninrre-I/rhefrfDe', 'Draw': '2'}, {'Position': '4', 'ID': '3/em-r0fninrre-I/rhefrfDe', 'Draw': '4'}, {'Position': '3', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '5'}, {'Position': '1', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '3'}, {'Position': '2', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '1'}, {'Position': '6', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '2'}, {'Position': '5', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '4'}, {'Position': '4', 'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '6'}]
>>> 
>>> out = {}
>>> for s in slst:
...     t = tuple(i for i in dlst if i['ID'] == s)
...     lt = len(t)
...     mdr = max(int(i['Draw']) for i in t)
...     if mdr <= lt:
...         md = min(t, key=lambda i: int(i['Position']))
...         out[s] = md, lt
... 
>>> out
{'3/em-r0fninrre-I/rhefrfDe': ({'ID': '3/em-r0fninrre-I/rhefrfDe', 'Draw': '1', 'Position': '1'}, 4), '//aRue-fatriR_teot-9tn_s-': ({'ID': '//aRue-fatriR_teot-9tn_s-', 'Draw': '6', 'Position': '1'}, 9), 'c_gsh_t.Srte6f:tesrs.o/sg': ({'ID': 'c_gsh_t.Srte6f:tesrs.o/sg', 'Draw': '3', 'Position': '1'}, 6), 'g3.erSi3th:12l9PgPr/iit/m': ({'ID': 'g3.erSi3th:12l9PgPr/iit/m', 'Draw': '3', 'Position': '1'}, 6)}
>>>

paraman
Вот так вышло, то что нужно.
Не, там повторный набор. Он для того и был, чтобы исключить словари, неподходящие по Draw.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB