как найти минимальные и максимальные значения внутри коллекций.defaultdict

#python-3.x

#python-3.x

Вопрос:

добрый день!

Я пытаюсь найти минимальные и максимальные значения для данного набора данных

 foo,1,1
foo,2,5
foo,3,0
bar,1,5
bar,2,0
bar,3,0
foo,1,1
foo,2,2
foo,3,4
bar,1,4
bar,2,0
bar,3,1
foo,1,4
foo,2,2
foo,3,3
bar,1,1
bar,2,3
bar,3,0
 

Я пытаюсь отсортировать свои данные, используя 1-й и 2-й столбцы в качестве идентификатора и 3-й столбец в качестве значения

 from collections import defaultdict

data = defaultdict(list)

with open("file1.txt", 'r') as infile:
    for line in infile:
        line = line.strip().split(',')
        meta = line[0]
        id_ = line[1]
        value = line[2]
        try:
            value = int(line[2])
            data[meta id_].append(value)
        except ValueError:
            print ('nope', sep='')
 

вывод моей функции:

 defaultdict(list,
            {'foo1': ['1', '1', '4'],
             'foo2': ['5', '2', '2'],
             'foo3': ['0', '4', '3'],
             'bar1': ['5', '4', '1'],
             'bar2': ['0', '0', '3'],
             'bar3': ['0', '1', '0']})
 

пожалуйста, посоветуйте, как я могу получить минимальные и максимальные значения для каждого идентификатора?

итак, мне нужен вывод чего-то подобного:

  defaultdict(list,
                {'foo1': ['1', '4'],
                 'foo2': ['2', '5'],
                 'foo3': ['0', '4'],
                 'bar1': ['1', '5'],
                 'bar2': ['0', '3'],
                 'bar3': ['0', '1']})
 

Обновить:

с помощью @AndiFB я добавляю сортировку в свои списки:

 def sorting_func(string):
    return int(string)

from collections import defaultdict

data = defaultdict(list)

with open("file1.txt", 'r') as infile:
    for line in infile:
        line = line.strip().split(',')
        meta = line[0]
        id_ = line[1]
        value = line[2]
        try:
            if value != "-":
                value = int(line[2])
                data[meta id_].append(value)
                data[meta id_].sort(key=sorting_func)
                print("max:", *data[meta id_][-1:], 'min:',*data[meta id_][:1])
        except ValueError:
            print ('nope', sep='')
                        
data
 

Вывод:

 max: 1 min: 1
max: 5 min: 5
max: 0 min: 0
max: 5 min: 5
max: 0 min: 0
max: 0 min: 0
max: 1 min: 1
max: 5 min: 2
max: 4 min: 0
max: 5 min: 4
max: 0 min: 0
max: 1 min: 0
max: 4 min: 1
max: 5 min: 2
max: 4 min: 0
max: 5 min: 1
max: 3 min: 0
max: 1 min: 0
defaultdict(list,
            {'foo1': [1, 1, 4],
             'foo2': [2, 2, 5],
             'foo3': [0, 3, 4],
             'bar1': [1, 4, 5],
             'bar2': [0, 0, 3],
             'bar3': [0, 0, 1]})
 

Пожалуйста, посоветуйте, как сохранить только минимальное и максимальное (первое и последнее) значения в списке?

чтобы получить что-то вроде этого:

 defaultdict(list,
                {'foo1': ['1', '4'],
                 'foo2': ['2', '5'],
                 'foo3': ['0', '4'],
                 'bar1': ['1', '5'],
                 'bar2': ['0', '3'],
                 'bar3': ['0', '1']})
 

Ответ №1:

 def sorting_func(string):
    return int(string)


d = defaultdict(list)
d['python'].append('10')
d['python'].append('2')
d['python'].append('5')

print("d['python'].__contains__('10'): {}".format(d['python'].__contains__('10')))
print(str(d['python']))
d['python'].sort(key=sorting_func)
print('d["python"]: '   str(d['python']))
print('d["python"][0]: '   d['python'][0])
print('d["python"][2]: '   d['python'][2])
print(str(len(d['python'])))
 

В результате получается следующий вывод

 d['python'].__contains__('10'): True
['10', '2', '5']
d["python"]: ['2', '5', '10']
d["python"][0]: 2
d["python"][2]: 10
3
 

Вы можете отсортировать список, оставив в первой позиции минимальное значение, а в последней
— максимальное значение

Имейте в виду, что если строка, содержащаяся в dic, не может быть преобразована в Int, это приведет к исключению. Функция сортировки ожидает, что число будет сравниваться. Например, другая функция сортировки может быть:

 def sorting_func(string):
    return len(string)
 

Этот сортирует по длине строки.

Ответ №2:

Поскольку вы работаете с набором данных, простым способом достижения этой цели было бы использование pandas, а затем выполнение groupby id и агрегирование values для получения минимальных и максимальных значений для каждого идентификатора

 #your question

s ="""foo,1,1
foo,2,5
foo,3,0
bar,1,5
bar,2,0
bar,3,0
foo,1,1
foo,2,2
foo,3,4
bar,1,4
bar,2,0
bar,3,1
foo,1,4
foo,2,2
foo,3,3
bar,1,1
bar,2,3
bar,3,0"""

#splitting on new line

t = s.split('n')

#creating datframe with comma separation
import pandas as pd
df = pd.DataFrame([i.split(',') for i in t])

Output:

>>> df
      0  1  2
0   foo  1  1
1   foo  2  5
2   foo  3  0
3   bar  1  5
4   bar  2  0
5   bar  3  0
6   foo  1  1
7   foo  2  2
8   foo  3  4
9   bar  1  4
10  bar  2  0
11  bar  3  1
12  foo  1  4
13  foo  2  2
14  foo  3  3
15  bar  1  1
16  bar  2  3
17  bar  3  0

#creating id column by concatenating column 1 and 2, renaming column 2 as 'value' and dropping them col1 and 2
df['id']=df[0] df[1]
df = df.rename(columns={df.columns[2]: 'value'})
df = df.drop([0,1], axis = 1)

Output:

>>> df
   value    id
0      1  foo1
1      5  foo2
2      0  foo3
3      5  bar1
4      0  bar2
5      0  bar3
6      1  foo1
7      2  foo2
8      4  foo3
9      4  bar1
10     0  bar2
11     1  bar3
12     4  foo1
13     2  foo2
14     3  foo3
15     1  bar1
16     3  bar2
17     0  bar3

#doing grouby and aggregating to get min and max for each id

df.groupby('id').value.agg([min,max])

Output:

     min max
id          
bar1   1   5
bar2   0   3
bar3   0   1
foo1   1   4
foo2   2   5
foo3   0   4
 

Комментарии:

1. спасибо, но я стараюсь выполнять эти задачи без панд