我想在特定点之后将现有列表的所有元素追加到新列表中
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>`)
}
答案 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 ...")
我希望这会有所帮助! :)