2016-09-01 3 views
-1

Ich habe eine Liste, die ich mit einer for-Schleife generiert habe. es gibt zurück:Python: Wie 2 Spalten/Index in einer Liste zurückgegeben werden

home1-0002_UUID 3457077784 2132011944 1307504896 62% 
home1-0003_UUID 3457077784 2088064860 1351451980 61% 
home1-0001_UUID 3457077784 2092270236 1347246604 61% 

Wie kann ich nur die dritte und fünfte Spalte zurückgeben?

EDIT wenn ich einen Fehler es sagt ‚Nonetype‘ Objekt nicht iterable ist

for index, elem in enumerate(my_list): 
    print (index,elem) 

Ich habe auch versucht, den Index zu erhalten, indem die Liste mit (aufzählen (my_list)), aber es funktioniert ich nicht arbeiten Typeerror erhalten: ‚NoneType‘ Objekt ist nicht iterable

das ist, wie ich die Liste zu füllen:

def h1ost(): 
    p1 = subprocess.Popen("/opt/lustre-gem_s/default/bin/lfs df /lustre/home1 | sort -r -nk5",stdout=subprocess.PIPE, shell=True) 
    use = p1.communicate()[0] 
    for o in use.split('\n')[:6]: 
     if "Available" not in o and "summary" not in o: 
      print (o) 
+0

wie ist Ihre Liste getrennt zu bekommen? Kannst du die tatsächliche Ausgabe hinzufügen? Ist das eine Liste oder ein Datenrahmen? – depperm

+0

'[[col [2], col [4]] für col in the_list]'? – Claudiu

+0

ist es ein Array von Arrays? – depperm

Antwort

1

Soweit ich keinen Kommentar posten kann ich mein Bestes zu geben, y tun ou eine Lösung für die Frage.

def empty_string_filter(value): 
    return value != '' 

def h1ost(): 
    p1 = subprocess.Popen("/opt/lustre-gem_s/default/bin/lfs df /lustre/home1 | sort -r -nk5",stdout=subprocess.PIPE, shell=True) 
    use = p1.communicate()[0] 
    new_file_content_list = [] 
    # Separate by line break and filter any empty string 
    filtered_use_list = filter(empty_string_filter, use.split(os.linesep)[:6]) 
    for line in filtered_use_list : 
     # Split the line and filter the empty strings in order to keep only 
     # columns with information 
     split_line = filter(empty_string_filter, line.split(' ')) 
     # Beware! This will only work if each line has 5 or more data columns 
     # I guess the correct option is to check if it has at least 5 columns 
     # and if it hasn't do not store the information or raise an exception. 
     # It's up to you. 

     new_file_content_list.append('{0} {1}'.format(split_line[2] , split_line[4])) 

    return os.linesep.join(new_file_content_list) 

So ist die Idee, jede einzelne Zeile von weißen Flächen aufgeteilt und Filter eine leere Zeichenfolge links, um den 3. und 5. Spalte (Index 2 bzw. 4)

+0

danke für die Antwort. Das funktioniert sehr gut. Das Ergebnis ist h1ost() (['62% ', '61%', '61% ', '60%', '59% '], ['/lustre/home1 [OST: 2] ','/lustre/home1 [OST: 3] ','/lustre/home1 [OST: 1] ','/lustre/home1 [OST: 0] ','/lustre/home1 [OST: 4] ']) Kann es zurück in den ursprünglichen Zustand formatiert werden oder wird das erreicht, indem man das in eine Datei schreibt? –

+0

Ich habe die Antwort geändert, um eine einzelne Zeichenfolge abzurufen, die bereit ist, in eine Datei geschrieben zu werden. Normalerweise würde der Beitritt in einer externen Funktion erfolgen, um Datenmanagement zu ermöglichen – Almasyx

+0

das funktioniert großartig! Die \ n im Rücklauf richten sich perfekt aus, wenn ich die Rückgabe drucke. –

Verwandte Themen