Eggs score 1.13 on DIAAS. Dairy scores 1.14, beef 1.11, chicken 1.08, and fish 1.00. Anything at or above 1.00 has no amino acid running short, which is what people mean by complete protein. Peanut butter scores 0.43, beans 0.57 to 0.59, and wheat 0.45.
Those are the numbers. Here’s what to do with them.
| Food | DIAAS score | Limiting amino acid | Protein per dollar |
|---|---|---|---|
| Milk, cheese, yogurt, cottage cheese | 1.14 | none | 26.3 to 30.1 g |
| Eggs | 1.13 | none | 34.4 g |
| Ground beef | 1.11 | none | 11.5 g |
| Chicken | 1.08 | none | 24.5 to 50.3 g |
| Canned tuna | 1.00 | none | 22.4 g |
| Soy (tofu, TVP) | 0.90 | none listed | 13.6 to 22.5 g |
| Chickpeas | 0.83 | tryptophan | 56.7 g |
| Lentils | 0.63 | sulfur amino acids | 56.0 to 77.7 g |
| White rice | 0.60 | lysine | 48.0 g |
| Beans (pinto, black, navy) | 0.57 to 0.59 | sulfur amino acids | 75.9 to 97.9 g |
| Rolled oats | 0.54 | lysine | 46.6 g |
| Wheat flour, bread, pasta | 0.45 | lysine | 35.8 to 96.0 g |
| Peanut butter | 0.43 | lysine | 50.7 g |
Source: USDA FoodData Central + US store prices, July 2026. Full methodology at /methodology/.
What does a complete protein actually mean?
Your body needs nine essential amino acids it can’t make on its own. A protein source is called complete when it supplies all nine in useful amounts. Incomplete doesn’t mean missing one entirely, it usually means one of them shows up in short supply relative to the others, and that one is called the limiting amino acid.
DIAAS is the modern scale for this. It accounts for how much of each amino acid a food delivers and how much of it you actually absorb, then reports a number where 1.00 means nothing is limiting. It’s a better measure than the older scoring systems and it’s what we used when we re-ranked cheap proteins in protein per dollar adjusted for quality.
One thing to keep in proportion: a score of 0.59 doesn’t mean beans are worthless protein. It means a gram of bean protein does about 59 percent of the job a gram of egg protein does. That’s a discount, not a disqualification.
Why are eggs a complete protein?
Because nothing in the egg runs short, and almost all of it gets absorbed. That combination is what lands eggs at 1.13, above the reference line.
It’s the reason eggs turn up as the benchmark in nutrition writing, and it’s genuinely earned. What it doesn’t make eggs is protein-dense: at 12.56 grams per 100 grams they sit 36th of the 49 foods we priced, well behind dry lentils and peanuts. Quality and density are different questions and eggs win only one of them. The amounts are in how much protein is in two eggs and the density ranking is in foods highest in protein per 100 grams.
Dairy actually edges eggs out at 1.14, which covers milk, mozzarella, cheddar, cottage cheese, and Greek yogurt alike. Nobody puts that on a poster, but it’s what the numbers say.
Is peanut butter a complete protein?
No, and it’s the lowest score in the set at 0.43, limited by lysine. Same story for wheat at 0.45 and oats at 0.54, because cereal grains and peanuts share that particular gap.
This does not make peanut butter a bad buy. It carries 22.21 grams of protein per 100 grams and returns 50.7 grams per dollar, tenth of 49 foods. It’s just doing less per gram than the raw number suggests, which is why it drops to 21.8 quality-adjusted grams per dollar once the score is applied. The full peanut butter picture is in how much protein is in peanut butter.
The lysine gap is also why peanut butter on white bread is two lysine-limited foods stacked on each other. Perfectly fine lunch. Just not the amino acid coverage it looks like.
What about beans and lentils?
Beans score 0.57 to 0.59, lentils 0.63, chickpeas 0.83. They’re limited by the sulfur amino acids, which is the opposite gap from the grains.
That opposition is the entire trick. Legumes and grains complement each other’s amino acid profiles, so beans with rice, lentils with bread, or dal with rice covers ground that neither does alone. It’s not a modern hack, it’s most of the world’s traditional cooking, and we priced it out properly in the cheapest complete protein pairs and beans and rice as a complete protein meal.
Soy is the plant exception at 0.90, which is why tofu, tempeh, and TVP get described as complete. It’s the one legume that doesn’t need a partner grain to hold up its end.
Does the pairing have to happen in the same meal?
The old advice was to combine at every sitting, and that’s been relaxed a lot. The pairing doesn’t need to land in one bowl, which is a relief for anyone who eats lentil soup for lunch and toast for breakfast.
What matters more is variety across the day. If most days include some dairy, eggs, fish or meat, or a decent mix of legumes and grains, the amino acid question mostly sorts itself. Where this genuinely deserves attention is a fully plant-based week built on one crop, and even then the fix is a second crop rather than anything you buy in a tub. The plant-side breakdown is in plant-based protein sources.
Here’s the part I find most useful. The cheapest proteins in the store are the incomplete ones, and after the quality adjustment they still win. Pinto beans go from 97.9 grams per dollar to 57.8 and stay first. Chicken breast sits at 24.5 either way. Being incomplete costs beans a lot on paper and almost nothing on the receipt, which is the practical version of this whole page and the shopping version lives in high protein on a budget.




