Как я могу одновременно сортировать список списков, отфильтровывая определенные значения? - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть файл ASCII из трех столбцов, и я хочу отсортировать и отфильтровать файл на основе третьего столбца.То есть я хочу расположить третий столбец от наименьшего к наибольшему и вынуть все значения выше, скажем, 8,0.Я знаю, как сделать обе эти вещи, если бы это было сделано непосредственно для одного списка.Однако я не знаю, как применить изменения, которые я сделал для третьего столбца, ко всем столбцам, так как каждая строка связана друг с другом.

Небольшой побочный вопрос: я распаковал файл ascii следующим образом:

f=open('textfile.dat',"r")
lines=f.readlines()
result=[]
for x in lines:
    result.append(x.split('\n')[0])

a = []
b = []
c = []    
for w in result:
    ra.append(w.split()[0])
for x in result:
    dec.append(x.split()[1])
for y in result:
    mag.append(y.split()[2])

p=0
for i in a:
    a[p] = float(i)
    p= p+1    
q=0
for j in b:
    b[q] = float(j)
    q= q+1    
r=0
for k in c:
    c[r] = float(k)
    r= r+1

test=[a,b,c]

Что, по меньшей мере, кажется излишне утомительным.Есть ли способ сделать это более компактно?Это просто файл ascii с четырьмя столбцами.Хотя они являются числами, их читают как «str», и поэтому я должен изменить их обратно на числа с плавающей точкой.

Кажется, что для сортировки используется просто транспонер, а затем сортировка по столбцам, что решает мой первый вопрос.

tset = zip(*test)
tset.sort(key = lambda x: x[2])
sorttest = zip(*tset)

Однако, если бы я хотел избавиться от всех чисел в третьемВ столбце выше, скажем, 8.0, я бы сделал что-то вроде:

testrange[2] = [i for i in sorttest[2] if i <= 8.0]

Однако это относится только к одной строке.Я не могу, например, сделать что-то вроде

testrange[0] = [i*1.0 for i in sorttest[2] if i <= 8.0]
testrange[1] = [i*1.0 for i in sorttest[2] if i <= 8.0]

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

Редактировать:

Sample input:
 [5,12,3,7,90]
 [9,1,63,23,8]
 [73,11,8,2,5]

Sample output:
 [7,90,3,12]
 [23,8,63,1]
 [2,5,8,11]

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Вы можете использовать numpy:

import numpy as np

x = [[5,12,3,7,90],
     [9,1,63,23,8],
     [73,11,8,2,5]]
x = np.array(x)
x = x[:, np.where(x[2] < 70)[0]]
x = x[:, np.argsort(x[2])].tolist()

Это даст вам:

[[7, 90, 3, 12], [23, 8, 63, 1], [2, 5, 8, 11]]

0 голосов
/ 06 февраля 2019

Так что, возможно, я пропустил ваше требование, но для каждой строки вы могли бы составить список элементов из этой строки.Вы получите список (строки) списков (отдельные элементы строки).Затем вы можете отсортировать строки по столбцу 3 каждой строки.Затем отфильтруйте этот список (строк) по значению столбца 3s.Я сделал это как отдельные шаги, но вы можете объединить их.

my_data = """1.4 2.5 5.6
2.4 7.5 9.8
4.8 9.7 2.5
4.5 6.5 7.9
1.3 3.4 12.6"""

list_of_data = [line.split() for line in my_data.split("\n")]
sorted_list = sorted(list_of_data, key=lambda line: float(line[2]))
filtered_list = [line for line in sorted_list if float(line[2]) < 8.0]
for line in filtered_list:
    print(" ".join(line))

OUTPUT

4.8 9.7 2.5
1.4 2.5 5.6
4.5 6.5 7.9

Таким образом, выходные данные удалили те строки, где 3-й столбец был 8.0 или больше.и все связанные числа из той же строки также совпадают и в порядке, основанном на 3-м столбце

...