You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Go/Python中获取查询结果与数组中的唯一值并保留首个值

1. Go语言中检查查询结果重复值并捕获首个出现的值

要在Go里搞定这个需求,最顺手的方式是借助map来跟踪已出现的值——毕竟map的键天生唯一,遍历查询结果时,每遇到一个值先查它在不在map里:如果不在,就把它存进结果切片,同时标记到map里;如果已经存在,直接跳过。这样就能保证结果里只留每个值的首次出现。

示例代码如下:

package main

import "fmt"

// 模拟你的查询结果结构体
type ResultRow struct {
    Nobilling string // 对应你代码里的row.Nobilling
}

func main() {
    // 模拟一组查询结果数据
    result := []ResultRow{
        {"1234567001"},
        {"1234567001"},
        {"4567898001"},
        {"1234567001"},
        {"4567898001"},
    }

    seen := make(map[string]bool) // 用map记录已经出现过的值
    uniqueFirstVals := []string{} // 存储首个出现的唯一值

    for _, row := range result {
        nobil := row.Nobilling
        if !seen[nobil] {
            seen[nobil] = true
            uniqueFirstVals = append(uniqueFirstVals, nobil)
        }
    }

    fmt.Println("首个出现的唯一值:", uniqueFirstVals) // 输出: [1234567001 4567898001]
}

这个方法时间复杂度是O(n),处理大量数据也很高效。


2. 从JSON数组中提取不同的值(Go/Python实现)

Go语言实现

先把JSON字符串解析成Go的切片,再用map去重,最后转成结果切片即可:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    jsonStr := `{"data":[ "1234567001", "1234567001", "1234567001", "1234567001", "4567898001", "4567898001", "4567898001" ]}`

    // 定义对应JSON结构的结构体
    type Response struct {
        Data []string `json:"data"`
    }

    var resp Response
    if err := json.Unmarshal([]byte(jsonStr), &resp); err != nil {
        fmt.Println("JSON解析出错:", err)
        return
    }

    // 去重逻辑和第一个问题类似
    seen := make(map[string]bool)
    uniqueVals := []string{}
    for _, val := range resp.Data {
        if !seen[val] {
            seen[val] = true
            uniqueVals = append(uniqueVals, val)
        }
    }

    fmt.Println("提取的不同值:", uniqueVals) // 输出: [1234567001 4567898001]
}

Python语言实现

Python处理这个就更简洁了,直接用**集合(set)**自动去重的特性,转成列表就行:

import json

json_str = '''{"data":[ "1234567001", "1234567001", "1234567001", "1234567001", "4567898001", "4567898001", "4567898001" ]}'''

# 解析JSON字符串
data = json.loads(json_str)["data"]

# 用集合去重,再转成列表
unique_vals = list(set(data))
print("提取的不同值:", unique_vals) # 输出: ['1234567001', '4567898001'](顺序可能因Python版本略有不同)

# 如果需要严格保留首次出现的顺序(Python 3.7+集合会保留插入顺序),用字典更稳妥:
unique_vals_ordered = list(dict.fromkeys(data))
print("保留顺序的不同值:", unique_vals_ordered) # 输出: ['1234567001', '4567898001']

3. 修改Go代码以存储数组中的不同值

你的原始代码有几个小问题:比如变量i未定义,row.billing如果是结构体字段的话得大写(Go里私有字段没法在外部访问),而且逻辑没实现去重。我们用map来跟踪已出现的nobil值,修改后的代码如下:

// 先定义你的结果行结构体,注意字段名首字母大写(要在外部访问的话)
type ResultRow struct {
    Nobilling string
    Billing   string
}

func getUniqueNobillings(result []ResultRow) []interface{} {
    vals := []interface{}{}
    seen := make(map[string]bool) // 记录已经添加过的Nobilling值

    for _, row := range result {
        nobil := row.Nobilling
        // 只有当这个值没出现过的时候,才添加到vals里
        if !seen[nobil] {
            seen[nobil] = true
            vals = append(vals, nobil)
        }
        // 你的原始代码里的判断,这里修正字段名为大写Billing
        if nobil == row.Billing {
            continue
        }
        // 如果需要计数,在这里初始化i并递增就行
        // i++
    }

    return vals
}

关键修改说明:

  1. 新增seen map防止重复值存入vals,保证最终切片里都是唯一值。
  2. 修正字段名大小写:Go中结构体字段要在外部包访问的话,必须首字母大写,所以row.billing改成row.Billing(如果你的字段本来就是小写,那只能在同一个包内使用这个函数)。
  3. 移除未定义的i,如果需要计数可以自行初始化。

这样改完后,vals里就只会存储不同的Nobilling值了。

内容的提问来源于stack exchange,提问作者F.T. Wicaksono

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:33:18