从列表Python中的特定点循环

时间:2018-11-11 22:27:03

标签: python list nested-lists flatten

我想在特定点之后将现有列表的所有元素追加到新列表中

var baseDirectory string
var ipaddress string

func main() {
    baseDirectory = "/usr/local/go/" // provide the base directory path where the files will be kept
    ipaddress = "localhost"          // provide the ip address of the webserver
    http.HandleFunc("/", homePage)
    http.HandleFunc("/uploadfile", uploadFile)
    fs := http.FileServer(http.Dir("static/"))
    http.Handle("/static/", http.StripPrefix("/static/", fs))
    err := http.ListenAndServe(":80", nil)
    if err != nil {
        fmt.Println("Error occurred ", err)
    }
}
func homePage(w http.ResponseWriter, req *http.Request) {
    var options [1]string

    options[0] = "</br><a href = \"http://" + ipaddress + ":80/uploadfile\">Click to upload file</a></br>"
    w.Header().Set("CONTENT-TYPE", "text/html; charset=UTF-8")
    fmt.Fprintf(w, "<h1>%s</h1>, <div>%s</div>", "Home Page\n", options)
}

func uploadFile(w http.ResponseWriter, req *http.Request) {
    //var s string
    if req.Method == http.MethodPost {
        f, handler, err := req.FormFile("usrfile")
        if err != nil {
            log.Println(err)
            http.Error(w, "Error uploading file", http.StatusInternalServerError)
            return
        }
        defer f.Close()
        filename := handler.Filename
        fmt.Println(filename)
        bs, err := ioutil.ReadAll(f)
        if err != nil {
            log.Println(err)
            http.Error(w, "Error reading file", http.StatusInternalServerError)
            return
        }
        fmt.Println(bs)
        err1 := ioutil.WriteFile(baseDirectory+filename, bs, 0644)
        if err != nil {
            log.Fatal(err1)
        }
        fmt.Println("Success!")
    }

    w.Header().Set("CONTENT-TYPE", "text/html; charset=UTF-8")
    fmt.Fprintf(w, `<form action="/uploadfile" method="post" enctype="multipart/form-data">
        Upload a file<br>
        <input type="file" name="usrfile"><br>
        <input type="submit">
        </form>
        <br>
        <br>`)

}

6 个答案:

答案 0 :(得分:3)

这里有两种有效地迭代数据的功能方法。

如果子列表大小均匀,并且您知道从哪里开始提取元素的索引,请使用chain + islice

from itertools import chain, islice
n = 3 # Sublist size.
i,j = 0,2
newlist = list(islice(chain.from_iterable(m), i*n + j, None))

如果您事先不知道子列表的大小,则可以使用next丢弃数据的第一部分。

V = chain.from_iterable(m)
next(v for v in V if v == m[i][j])
newlist = list(V)
newlist.insert(m[i][j], 0)

这假定序列中较早的位置没有相同的值。

答案 1 :(得分:2)

您可以直接分割第一个目标列表的其余部分,然后添加所有后续元素,例如:

m = [[1,2,3],[4,5,10],[6,2,1]]
y, x = 0, 2
new_list = m[y][x:] + [v for el in m[y+1:] for v in el]
# [3, 4, 5, 10, 6, 2, 1]

答案 2 :(得分:1)

您可以在迭代中放置一个条件,并仅基于该条件进行添加。达到该特定索引后,使条件成立。像这样:

m = [[1,2,3],[4,5,10],[6,2,1]]
specific_point = (0,2)
newlist = [3,4,5,10,6,2,1]


output = []
for i in range(len(m)):
    for j in range(len(m[i])):
        if (i,j) < specific_point:
            continue

        output.append(m[i][j])

输出:

[3, 4, 5, 10, 6, 2, 1]

答案 3 :(得分:1)

为什么不拼合初始列表并从那里开始

flat_list = [item for sublist in m for item in sublist]

将返回[1,2,3,4,5,10,6,2,1],所以现在您真的在flat_list[2:]

答案 4 :(得分:1)

大多数答案仅适用于这种特定形状的嵌套列表,但是也可以创建适用于任何形状的嵌套列表的解决方案。

def flatten_from(sequence, path=[]):
    start = path.pop(0) if path else 0
    for item in sequence[start:]:
        if isinstance(item, (list, tuple)):
            yield from flatten_from(item, path)
        else:
            yield item

以问题中的示例为例

>>> list(flatten_from([[1, 2, 3], [4, 5, 10], [6, 2, 1]], [0, 2]))
[3, 4, 5, 10, 6, 2, 1]

它也适用于任何形状和层次的输入数据嵌套

m = [[1], [[2], [3, 4, 5, 6, 7]], 8, [9, [10, 11]]]

flatten_from(m, []))       # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
flatten_from(m, [2])       # 8, 9, 10, 11
flatten_from(m, [1, 1, 3]) # 6, 7, 8, 9, 10, 11

但是,这有点混蛋算法。一方面,它使用了很好的函数式编程概念:递归和收益。

另一方面,它依赖于用list.pop更改path参数的副作用,因此它不是一个纯函数。

答案 5 :(得分:0)

以下解决方案适用于您的情况,即您的阵列仅限于列表列表,并且“ sublist”的大小在整个情况下保持一致,即在您的情况下为“ 3”

query({IFERROR('Sheet 1'!A1:B100, {}); IFERROR('Sheet 2'!A1:B100, {}) "select * where ...")

我希望这会有所帮助! :)